You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Matplotlib/Seaborn为多层索引DataFrame绘制分组柱状图

解决单柱状图中展示多层索引分组数据的问题

我明白你想要实现的效果:在同一个柱状图里,每个genre类别下对应miscl_count的3个取值(4、5、6)各显示一个独立柱子,并且用不同颜色区分不同的genre。下面我来一步步帮你实现这个需求:

理解你的数据结构

你已经通过groupby(['genre', 'miscl_count']).count()得到了多层索引的结果,这个结果的行索引是genre和miscl_count,值是每个组合下的艺人数量。我们需要把这个结构调整成适合绘图的格式。

方法一:使用Pandas内置绘图(简单快捷)

核心是用unstack()方法调整数据结构,选择正确的索引层级来展开:

# 将miscl_count这个索引层级展开为列
miscl_df_group.unstack(level='miscl_count').plot(kind='bar')

为什么这样做?

  • unstack(level='miscl_count')会把第二层索引miscl_count转换成列,此时你的DataFrame结构会变为:
    genreartist_4artist_5artist_6
    a1199
    b191316
    ............
  • 调用plot(kind='bar')后,每个genre会对应一组3个柱子(分别对应miscl_count的4、5、6),同一genre的柱子颜色相同,不同genre颜色不同,完全匹配你的需求。

如果想优化图表样式,可以添加额外参数:

ax = miscl_df_group.unstack(level='miscl_count').plot(kind='bar', figsize=(10,6), rot=0)
ax.set_title('Artist Count by Genre and Miscl Count')
ax.set_xlabel('Genre')
ax.set_ylabel('Number of Artists')
plt.legend(title='Miscl Count')
plt.show()

方法二:使用Seaborn实现(更灵活的样式控制)

如果你想要更自定义的视觉效果,可以先把数据转换成长格式,再用Seaborn绘制:

import seaborn as sns
import matplotlib.pyplot as plt

# 把多层索引转换成普通列
miscl_df_flat = miscl_df_group.reset_index()

# 自定义调色板,确保同一genre的不同miscl_count柱子颜色一致
genre_palette = {'a': '#FF6B6B', 'b': '#4ECDC4', 'c': '#45B7D1', 'd': '#96CEB4', 'e': '#FFEAA7'}

# 绘制柱状图,按genre分配颜色,同一genre下的miscl_count柱子并排展示
sns.barplot(
    data=miscl_df_flat,
    x='genre',
    y='artist',
    hue='miscl_count',
    palette=genre_palette
)
plt.title('Artist Count by Genre and Miscl Count')
plt.xlabel('Genre')
plt.ylabel('Number of Artists')
plt.show()

内容的提问来源于stack exchange,提问作者PaganScientist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:00:48