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

如何用Matplotlib绘制含分类变量与分组的误差棒子图

实现子图形式的误差棒图(Matplotlib + Pandas)

核心思路

按数据分组拆分,创建Matplotlib子图网格,为每个分组单独绘制误差棒,替代原来的单图合并展示。


假设你的数据结构(示例)

先模拟一个和你类似的DataFrame(如果你的结构不同,只需调整分组逻辑):

import pandas as pd
import matplotlib.pyplot as plt

# 示例数据:按Group列分组,包含X轴标签、均值、标准差
df = pd.DataFrame({
    'Group': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
    'X_Label': ['Sample1', 'Sample2', 'Sample3'],
    'Mean_Value': [10, 12, 15, 8, 9, 11, 14, 16, 18],
    'Std_Error': [1.2, 0.8, 1.5, 0.9, 1.1, 0.7, 1.3, 1.0, 1.4]
})

修改后的代码(子图形式)

# 1. 获取所有唯一分组
groups = df['Group'].unique()

# 2. 设置子图布局:这里用2列,行数自动计算(避免空轴太多)
n_cols = 2
n_rows = (len(groups) + n_cols - 1) // n_cols  # 向上取整计算行数

# 3. 创建子图网格
fig, axes = plt.subplots(n_rows, n_cols, figsize=(10, 6))
axes = axes.flatten()  # 把二维轴数组转成一维,方便遍历

# 4. 逐个分组绘制误差棒
for idx, group_name in enumerate(groups):
    # 筛选当前分组的数据
    group_data = df[df['Group'] == group_name]
    # 获取当前子图轴
    ax = axes[idx]
    
    # 绘制误差棒:fmt控制线条/标记样式,capsize设置误差棒帽子大小
    ax.errorbar(
        x=group_data['X_Label'],
        y=group_data['Mean_Value'],
        yerr=group_data['Std_Error'],
        fmt='o-',
        capsize=5,
        color='#1f77b4'
    )
    
    # 设置子图标题和标签
    ax.set_title(f'Group {group_name}')
    ax.set_xlabel('Samples')
    ax.set_ylabel('Mean Value')

# 5. 隐藏多余的空轴(如果分组数不是行列数的整数倍)
for empty_ax in axes[idx+1:]:
    empty_ax.axis('off')

# 自动调整子图间距,避免重叠
plt.tight_layout()
plt.show()

针对宽格式DataFrame的适配(如果你的数据是宽表)

如果你的数据是宽格式(每个分组的均值/误差单独成列),比如:

df_wide = pd.DataFrame({
    'X_Label': ['Sample1', 'Sample2', 'Sample3'],
    'A_Mean': [10,12,15], 'A_Std': [1.2,0.8,1.5],
    'B_Mean': [8,9,11], 'B_Std': [0.9,1.1,0.7],
    'C_Mean': [14,16,18], 'C_Std': [1.3,1.0,1.4]
})

只需修改遍历逻辑:

groups = ['A', 'B', 'C']
n_cols = 2
n_rows = (len(groups) + n_cols -1)//n_cols
fig, axes = plt.subplots(n_rows, n_cols, figsize=(10,6))
axes = axes.flatten()

for idx, group_name in enumerate(groups):
    ax = axes[idx]
    ax.errorbar(
        x=df_wide['X_Label'],
        y=df_wide[f'{group_name}_Mean'],
        yerr=df_wide[f'{group_name}_Std'],
        fmt='o-',
        capsize=5
    )
    ax.set_title(f'Group {group_name}')
    ax.set_xlabel('Samples')
    ax.set_ylabel('Mean Value')

for empty_ax in axes[idx+1:]:
    empty_ax.axis('off')

plt.tight_layout()
plt.show()

关键说明

  • plt.subplots()的figsize可以根据你的分组数量调整,保证子图清晰
  • capsize参数可以让误差棒显示帽子,提升可读性
  • tight_layout()自动处理子图间的间距,避免标题、标签重叠
  • 多余空轴隐藏后,布局更整洁专业

内容的提问来源于stack exchange,提问作者Jan Schatz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:46:04