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

如何实现按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:35:25