python - 为同一 seaborn 条形图中的不同类别组分配不同的调色板
问题描述
我正在尝试使用 sns.barplot 为我的类别组绘制条形图。每个组有几个不同的项目(每个> 5)。我想为不同的组设置不同的调色板。类似于ggplot2 中两个不同组的 Distinct color palettes和How 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))
解决方案
推荐阅读
- node.js - 我无法使用 Powershell 或 VsCode 创建简单的 Angular 项目
- vb.net - UiPath 使用 VB.net 与 Visual Studio 调用代码
- firebase - 将应用程序迁移到 Android X for Firebase Crashlytics,在 7.1.1 (SDK 25) 上停止安装
- .net - 如何从 Azure 应用程序网关后面的我的 Wordpress 博客中获取所有内容以定向到正确的服务?
- django - 通过 HTTP 请求调用 Django 视图比通过 Django shell 调用时慢得多
- java - Xamarin.Android 支持 GithubActions 工作流?(或如何以编程方式安装 JDK)
- jquery - Slick Slider - 在滑块初始化之前隐藏其他幻灯片
- model-view-controller - 当我添加到新表 MVC 5 时使用 SendGrid 发送电子邮件
- asp.net-core - 将 Azure AD 电子邮件记录到 ASP.NET 身份表中
- c++ - 如何在遍历向量时分配变量?