首页 > 解决方案 > 为同一 seaborn 条形图中的不同类别组分配不同的调色板

问题描述

我正在尝试使用 sns.barplot 为我的类别组绘制条形图。每个组有几个不同的项目(每个> 5)。我想为不同的组设置不同的调色板。类似于ggplot2 中两个不同组的 Distinct color palettesHow to use multiple colormaps in seaborn on same plot

为了说明,假设我的数据框为:

df = pd.DataFrame({'group':['G1','G1','G1','G2','G2','G2','G2','G2','G2','G2','G3','G3'],
              'item':['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'k', 'L'],
             'result':[1,5,4,10,2,4,13,2,6,11,12,9],
             'desired palette (for example)': ['mako', 'mako', 'mako', 'rocket', 'rocket', 'rocket', 'rocket', 'rocket', 'rocket', 'rocket','crest', 'crest']})
    group   item    result  desired palette (for example)
0   G1  A   1   mako
1   G1  B   5   mako
2   G1  C   4   mako
3   G2  D   10  rocket
4   G2  E   2   rocket
5   G2  F   4   rocket
6   G2  G   13  rocket
7   G2  H   2   rocket
8   G2  I   6   rocket
9   G2  J   11  rocket
10  G3  k   12  crest
11  G3  L   9   cres

因此,在group列中的每个组中,项目应排名(基于result列)并使用不同的顺序调色板进行绘图。例如,对于G1,我想将调色板设置为 'mako';G2, '火箭'; ...

df.sort_values(by=['group','result'], inplace=True)

sns.barplot('item', 'result', hue='group',data=df, palette=["mako", "rocket", "crest"])?

我们可以将它们绘制在一个图中吗?我们如何使用 seaborn 做到这一点?

我找到了一个愚蠢的解决方案:

fig, ax = plt.subplots(figsize=(5, 6))

ax.barh('item', 'result', data=df[df['group']=='G3'], color=sns.color_palette('Blues'), label="G3")
ax.barh('item', 'result', data=df[df['group']=='G2'], color=sns.color_palette('rocket_r'), label="G2")
ax.barh('item', 'result', data=df[df['group']=='G1'], color=sns.color_palette('mako_r'), label="G1")


ax.legend()

想要的无花果: 在此处输入图像描述

但是“G”的颜色不对。GJ的颜色应该是有顺序的。

正如@JohanC 的评论:

fig, ax = plt.subplots(figsize=(5, 6))
for label, pal in zip(
sorted(df['group'].unique().tolist(), reverse=True),
['Blues','rocket_r','mako_r']):
    data = df[df['group']==label]
    ax.barh('item', 'result', data=data, color=sns.color_palette(pal, n_colors=len(data)), label=label)

plt.show()

以下代码将仅显示最后一个。

fig, ax = plt.subplots(figsize=(5, 6))
for label, pal in zip(
sorted(df['group'].unique().tolist(), reverse=True),
['Blues','rocket_r','mako_r']):
    sns.barplot(y='item', x='result', data=df[df['group']==label], color=sns.color_palette(pal))

标签: pythonpandasseabornpalette

解决方案


推荐阅读