如何在Matplotlib中绘制与Excel效果一致的分组柱状图?
在Matplotlib中实现Excel样式的分组柱状图
问题概述
我有一组包含性别、病房、人数的表格数据,尝试用以下Matplotlib代码绘制柱状图:
pyplot.bar(gender, ward, width, color='orange') pyplot.bar(count, gender, width, color='tomato')
但得到的图表混乱,无法实现像Excel那样按性别分组,组内展示不同病房人数的分组柱状图效果。
解决方案
要实现目标效果,核心是通过调整x轴位置让同组的柱状条并排显示,以下是具体实现代码:
1. 准备数据
首先整理数据(这里用pandas简化操作,也可手动整理):
import pandas as pd import matplotlib.pyplot as plt # 替换为你的真实数据 df = pd.DataFrame({ 'gender': ['男', '男', '女', '女'], 'ward': ['内科', '外科', '内科', '外科'], 'count': [10, 15, 12, 18] }) # 获取唯一的性别分组和病房类别 gender_groups = df['gender'].unique() ward_categories = df['ward'].unique() bar_width = 0.35 # 单个柱子的宽度 group_positions = range(len(gender_groups)) # 性别组的基础x轴位置
2. 绘制分组柱状图
循环遍历每个病房类别,计算对应柱子的x轴偏移位置并绘制:
for idx, ward in enumerate(ward_categories): # 计算当前病房柱子的x轴位置:基础位置 + 偏移量 bar_positions = [pos + idx * bar_width for pos in group_positions] # 获取当前病房对应的人数数据 ward_counts = df[df['ward'] == ward]['count'].values # 绘制柱子并添加图例 plt.bar(bar_positions, ward_counts, bar_width, label=ward) # 设置x轴标签,对齐分组中心 plt.xticks([pos + bar_width/2 for pos in group_positions], gender_groups) # 添加图表元素 plt.legend(title="病房") plt.title("不同性别各病房人数统计") plt.ylabel("人数") plt.show()
关键逻辑说明
- 通过给不同类别的柱子设置x轴偏移量,实现同性别组内的并排展示
- 调整
xticks的位置到分组中心,保证标签与分组对齐 - 若不用pandas,可手动构造每个病房对应的人数列表,逻辑完全一致
内容的提问来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

