如何实现按SEED_WORD分组的literal与metaphoric双类别柱状图可视化
解决方案
问题根源
你当前的代码有两个明显问题:
- 用
count()统计的是分组后的行数,而非DataFrame里现成的size列数值 - 分组后的层级索引结构不对,导致每个(SEED_WORD, Metaphoric_Seed)组合单独成柱,没法实现同一个SEED_WORD下两类并排的效果
方法一:Pandas原生实现(转宽格式)
先把数据转成宽格式——让每个SEED_WORD当行索引,literal、metaphoric当列,对应size值填充进去,再直接画分组柱状图:
# 转宽格式,缺失的类别用0填充(比如只有literal的词,metaphoric列补0) df_pivot = df_all_annotated.pivot( index='SEED_WORD', columns='Metaphoric_Seed', values='size' ).fillna(0) # 绘制分组柱状图,rot=0可以让x轴标签不旋转,按需调整 df_pivot.plot(kind='bar', rot=0)
这样每个SEED_WORD会对应两个颜色不同的柱子,完美匹配你的需求。
方法二:用Seaborn直接画(不用转格式)
Seaborn的barplot天生支持长格式数据的分组可视化,直接指定参数就行:
import seaborn as sns import matplotlib.pyplot as plt sns.barplot( data=df_all_annotated, x='SEED_WORD', y='size', hue='Metaphoric_Seed' ) plt.xticks(rotation=45) # 旋转x轴标签,避免长单词重叠 plt.show()
这种方法不用改数据结构,代码更简洁,还会自动处理只有单类数据的情况(比如bracket这类只有literal的词,只会显示对应柱子)。
补充:原代码的问题拆解
原代码里groupby(['SEED_WORD','Metaphoric_Seed'])['SEED_WORD','Metaphoric_Seed'].count()做的是“统计每个分组里有多少行”,而不是用你已经有的size值。另外,分组后的结果是多层索引,直接plot会把每个(词,类别)组合当成独立的柱子,自然没法实现同一词下两类并排的效果。
内容的提问来源于stack exchange,提问作者idkwhattosayhere
相关产品推荐
相关产品推荐

