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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:20:30