Seaborn - 根据色调名称

时间:2017-09-12 09:58:38

标签: python seaborn

我使用seabornpandas从不同(但相关)的数据创建一些条形图。这两个数据集共享一个用作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')

制作两张图: 3 category bar plot 4 category bar plot

在此示例中,我想确保Total类别在两个图表中使用相同的颜色(例如黑色)

1 个答案:

答案 0 :(得分:10)

一种。使用颜色列表

确保两个图中相同类别具有相同颜色的最简单解决方案是在创建绘图时手动指定颜色。

# 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)

在这两种情况下,输出都是这样的:
enter image description here

℃。自动字典

最后,您可以根据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()))
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()