现在位置: 首页 > Matplotlib 教程 > 正文

Matplotlib errorbar() 函数


Matplotlib 参考文档 Matplotlib 参考文档

errorbar() 用于绘制带误差棒的折线图,在数据点上方展示测量值的不确定性范围。

广泛用于科学实验、统计分析和工程数据可视化中。

函数定义

pyplot 接口

matplotlib.pyplot.errorbar(x, y, yerr=None, xerr=None, fmt='',
    ecolor=None, elinewidth=None, capsize=None, barsabove=False,
    lolims=False, uplims=False, xlolims=False, xuplims=False,
    errorevery=1, capthick=None, *, **kwargs)

Axes 接口

Axes.errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None,
    elinewidth=None, capsize=None, barsabove=False, lolims=False,
    uplims=False, xlolims=False, xuplims=False, errorevery=1,
    capthick=None, *, **kwargs)

参数说明

参数类型说明
x, yarray-like数据点坐标
yerr / xerrfloat 或 array-likey/x 方向的误差。标量表示所有点相同误差,数组表示每点独立误差。二维数组可为 [lo, hi] 分别指定上下误差
fmtstr数据点的格式字符串,如 'o'(圆点)、's'(方块)、'o-'(圆点+连线)
ecolorcolor误差棒线条的颜色
elinewidthfloat误差棒线条的宽度
capsizefloat误差棒端点横线的长度(以点为单位)
capthickfloat误差棒端点横线的厚度
barsabovebool若为 True,误差棒绘制在数据点上方
lolims / uplimsarray-like of bool标记 y 方向的下/上限(只有单侧箭头)
xlolims / xuplimsarray-like of bool标记 x 方向的下/上限
erroreveryint每隔几个数据点绘制误差棒(数据稠密时减少视觉混乱)

errorbar() 返回一个 ErrorbarContainer 对象,包含 (plotline, caplines, barlinecols),可分别访问主线和误差棒线。


使用示例

示例 1:基本误差棒

实例

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1, 2, 3, 4, 5])
y = np.array([3.5, 5.2, 4.8, 6.1, 7.3])
y_err = np.array([0.3, 0.5, 0.4, 0.6, 0.5])  # 每个点的误差

fig, ax = plt.subplots(layout='constrained')

# 绘制带误差棒的折线图
ax.errorbar(x, y, yerr=y_err,
            fmt='o-',             # 圆点 + 连线
            color='steelblue',
            ecolor='gray',        # 误差棒颜色
            elinewidth=1.5,       # 误差棒线宽
            capsize=5,            # 端点横线长度
            capthick=1.5,
            markersize=8,
            label='Measurement')

ax.set_title('Errorbar Plot with y-errors')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()

示例 2:不对等误差(上下不同)

实例

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.array([10, 12, 9, 15, 13])

# 二维数组:第一行是下限误差,第二行是上限误差
y_err = np.array([[0.5, 0.8, 0.6, 1.0, 0.7],   # 下误差
                  [1.5, 1.2, 2.0, 0.8, 1.3]])  # 上误差

fig, ax = plt.subplots(layout='constrained')

ax.errorbar(x, y, yerr=y_err,
            fmt='s',              # 方块标记,不连线
            color='coral',
            ecolor='black',
            capsize=6,
            markersize=10,
            markerfacecolor='white',
            markeredgewidth=1.5,
            label='Asymmetric Error')

ax.set_title('Asymmetric Error Bars (different upper/lower)')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()

示例 3:双向误差棒(x 和 y 方向都有误差)

实例

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
x = np.arange(8)
y = 2 * x + 1 + np.random.randn(8) * 2
x_err = np.full(8, 0.3)          # x 方向误差(所有点相同)
y_err = np.random.rand(8) * 3    # y 方向误差(各点不同)

fig, ax = plt.subplots(figsize=(7, 5), layout='constrained')

ax.errorbar(x, y,
            xerr=x_err,           # x 方向误差
            yerr=y_err,           # y 方向误差
            fmt='o',
            color='#8e44ad',
            ecolor='gray',
            capsize=4,
            markersize=8,
            label='2D Error')

ax.set_title('Error Bars in Both X and Y Directions')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()

示例 4:errorevery 减少视觉混乱

实例

import matplotlib.pyplot as plt
import numpy as np

# 密集数据点(100 个点)
x = np.linspace(0, 10, 100)
y = np.sin(x) + np.random.randn(100) * 0.1
y_err = np.full(100, 0.15)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4),
                                 layout='constrained')

# 左图:每个点都显示误差棒(过于密集)
ax1.errorbar(x, y, yerr=y_err, fmt='o', markersize=3,
             capsize=2, elinewidth=0.5, errorevery=1)
ax1.set_title('errorevery=1 (too dense)')

# 右图:每隔 8 个点显示一个误差棒
ax2.errorbar(x, y, yerr=y_err, fmt='o', markersize=3,
             capsize=2, elinewidth=0.5, errorevery=8)
ax2.set_title('errorevery=8 (cleaner)')

for ax in [ax1, ax2]:
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.grid(True, alpha=0.3)

plt.show()

常见问题

yerr 的不同形状?

标量:所有点相同误差。

一维数组 (N,):每个点对称误差(上下相同)。

二维数组 (2, N):第一行为下误差,第二行为上误差。

不想要数据点之间的连线怎么办?

fmt 设为纯标记格式,如 'o''s''^',省略线型部分。


Matplotlib 参考文档 Matplotlib 参考文档