Seaborn-根据色相名称更改条形颜色
我正在使用,seaborn
并pandas
根据不同(但相关)的数据创建一些条形图。这两个数据集共享一个用作的公共类别hue
,因此,我想确保在两个图中该类别的条形颜色匹配。我该怎么办?
基本示例如下:
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
sns.set_style('darkgrid')
fig, ax = plt.subplots()
a = pd.DataFrame({'Program': ['A', 'A', 'B', 'B', 'Total', 'Total'],
'Scenario': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
'Duration': [4, 3, 5, 4, 9, 7]})
g = sns.barplot(data=a, x='Scenario', y='Duration',
hue='Program', ci=None)
plt.tight_layout()
plt.savefig('3 progs.png')
plt.clf()
b = pd.DataFrame({'Program': ['A', 'A', 'B', 'B', 'C', 'C', 'Total', 'Total'],
'Scenario': ['X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'Y'],
'Duration': [4, 3, 5, 4, 3, 2, 12, 9]})
g = sns.barplot(data=b, x='Scenario', y='Duration',
hue='Program', ci=None)
plt.tight_layout()
plt.savefig('4 progs.png')
在此示例中,我想确保Total
类别在两个图表中使用相同的颜色(例如黑色)
-
A.使用颜色列表
确保在两个图中相同类别的颜色相同的最简单解决方案是在创建绘图时手动指定颜色。
# First bar plot ax = sns.barplot(data=a, x='Scenario', y='Duration', hue='Program', ci=None, palette=["C0", "C1", "k"]) # ... # Second bar plot ax2 = sns.barplot(data=b, x='Scenario', y='Duration', hue='Program', ci=None, palette=["C0", "C1", "C2", "k"])
颜色
"C2"
(颜色周期的第三种颜色)仅存在于存在程序C的第二个图中。B.使用字典
除了列表以外,您还可以使用字典,将
hue
列中的值映射到颜色。palette ={"A": "C0", "B": "C1", "C": "C2", "Total": "k"} ax = sns.barplot(data=a, x='Scenario', y='Duration', hue='Program', palette=palette) # ... ax2 = sns.barplot(data=b, x='Scenario', y='Duration', hue='Program', palette=palette)
C.自动词典
最后,您可以根据
hue
列中的值自动创建此词典。这样做的好处是您不需要事先知道颜色,也不需要知道各个数据框中的值。import seaborn as sns import pandas as pd import matplotlib.pyplot as plt sns.set_style('darkgrid') fig, ax = plt.subplots() a = pd.DataFrame({'Program': ['A', 'A', 'B', 'B', 'Total', 'Total'], 'Scenario': ['X', 'Y', 'X', 'Y', 'X', 'Y'], 'Duration': [4, 3, 5, 4, 9, 7]}) b = pd.DataFrame({'Program': ['A', 'A', 'B', 'B', 'C', 'C', 'Total', 'Total'], 'Scenario': ['X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'Y'], 'Duration': [4, 3, 5, 4, 3, 2, 12, 9]}) unique = a["Program"].append(b["Program"]).unique() palette = dict(zip(unique, sns.color_palette(n_colors=len(unique)))) palette.update({"Total":"k"}) ax = sns.barplot(data=a, x='Scenario', y='Duration', hue='Program', ci=None, palette=palette) plt.tight_layout() plt.figure() ax2 = sns.barplot(data=b, x='Scenario', y='Duration', hue='Program', ci=None, palette=palette) plt.tight_layout() plt.show()