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)
In both cases, the output would look like this:
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()