如何用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结构会变为:genre artist_4 artist_5 artist_6 a 11 9 9 b 19 13 16 ... ... ... ... - 调用
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
相关产品推荐
相关产品推荐

