Python技术请求:基于性别分组绘制分数分组条形图
解决方案
你的需求是绘制4组条形(男-分数、男-等级、女-分数、女-等级),原代码未达预期大概率是数据结构处理或绘图参数的问题,以下是两种可行解决办法:
方法1:Pandas原生绘图快速实现
如果你的DataFrame是宽表结构(gender为一列,score和grade各为独立列),直接将gender设为索引再绘图即可:
import matplotlib.pyplot as plt # 将gender设为索引后绘图 data_gender.set_index('gender').plot(kind='bar', rot=0) # 添加基础美化 plt.title('分数与等级按性别分布') plt.ylabel('数值') plt.show()
这样会自动生成每个性别对应分数、等级的两组条形,加起来正好4个,匹配你的需求。
方法2:转长表后用Seaborn绘图(更灵活)
如果需要自定义样式(比如调整颜色、图例位置),先把宽表转成长表结构,再用Seaborn分组绘制:
import seaborn as sns import matplotlib.pyplot as plt # 宽表转长表,将score和grade合并为统一的指标列 data_melted = data_gender.melt(id_vars='gender', var_name='指标', value_name='数值') # 绘制分组条形图 sns.barplot(x='gender', y='数值', hue='指标', data=data_melted) plt.title('分数与等级按性别分布') plt.show()
这种方式可灵活调整绘图细节,同样能得到你要的4组条形。
原代码失效原因
你之前的data_gender.plot(x='gender',kind='bar', stacked=False)逻辑本身没问题,但如果你的DataFrame不是宽表(比如score和grade以行形式存储而非列),就会出现异常。另外将gender设为索引的方式,比直接指定x='gender'更直观,能避免结构适配问题。
内容的提问来源于stack exchange,提问作者Matthew101
相关产品推荐
相关产品推荐

