如何用pyplot基于Pandas DataFrame绘制男女生分组条形图
分组条形图实现方案(优先推荐低代码方案)
零繁琐操作的最简实现:Pandas内置绘图接口
多数人觉得纯写pyplot画分组条形图麻烦,本质是要手动处理x轴偏移、条形宽度匹配、图例生成这些重复逻辑,完全可以借助pandas封装好的绘图能力,几行代码就能出对应效果:
- 核心逻辑是让Team列作为绘图的分类索引,剩下的Boys、Girls列会自动被识别为分组序列
- 不需要手动计算每个条形的位置,pandas会自动给同个分类下的多个序列分配合适的x轴偏移、配置图例、匹配颜色
示例代码:
import pandas as pd import matplotlib.pyplot as plt # 按实际需求替换数据集即可 data = {'Team': ['Sharks', 'Lions'], 'Boys': [5, 3], 'Girls': [5, 7]} df = pd.DataFrame(data) # 设置Team为索引后直接调用bar绘图方法 df.set_index('Team').plot.bar(rot=0) # rot=0避免x轴标签自动倾斜,视觉更整洁 plt.ylabel('统计人数') plt.show()
这个方法跑出来的效果和你要的“每个队伍对应两根分别代表男生、女生数量的条形”完全一致,不需要额外写样式调整代码。
纯pyplot实现方案(适合需要高度自定义样式的场景)
如果需要对图表的细节做个性化调整,也可以用原生pyplot实现,核心是用numpy生成基础x坐标,给两个分组的条形做对称偏移,不需要硬算位置:
import matplotlib.pyplot as plt import numpy as np import pandas as pd data = {'Team': ['Sharks', 'Lions'], 'Boys': [5, 3], 'Girls': [5, 7]} df = pd.DataFrame(data) bar_width = 0.35 # 单根条形的宽度 x_pos = np.arange(len(df['Team'])) # 给每个队伍生成中心x坐标 # 两根条形分别向中心坐标的左右做半个条形宽度的偏移,刚好并排摆放 plt.bar(x_pos - bar_width/2, df['Boys'], width=bar_width, label='Boys') plt.bar(x_pos + bar_width/2, df['Girls'], width=bar_width, label='Girls') # 把x轴标签放到两根条形的中心位置,避免错位 plt.xticks(x_pos, df['Team']) plt.ylabel('统计人数') plt.legend() plt.show()
小提示:纯pyplot方案的灵活性更高,可以单独调整每根条形的边框、透明度、配色,但如果涉及多组数据、多个分类,手动调整偏移的工作量会快速上升,大部分日常场景下优先用Pandas内置绘图接口效率更高。
内容的提问来源于stack exchange,提问作者thePandasFriend
相关产品推荐
相关产品推荐

