首页编程开发Matplotlib【数据可视化(Matplo...

【数据可视化(Matplotlib篇)】47.绘制误差条图errorbar()

本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1jG-rGG4QMuZu0t0kEEl7SA?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Data_Visualization





误差条图(Error Bar)是一种在数据点附近添加误差标记的图形,通常用于表示数据的标准差、标准误差或置信区间。

01

函数语法


Matplotlib errorbar()函数专门用于绘制误差条图,其函数语法如下:
plt.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, data=None, **kwargs)
其中:
  • x:数组类数据,表示数据点的 x 坐标。

  • y数组类数据,表示数据点的 y 坐标。

  • yerr可选参数,数组类数据或 None,表示 y 方向的误差。若为标量,所有数据点的 y 误差相同;若为 1D 数组,每个数据点的 y 误差不同;若为 2D 数组,形状为 (2, n),表示每个点的下误差和上误差(不对称误差)。

  • xerr可选参数,与yerr类似,但表示 x 方向的误差。

  • fmt数据点/数据线的格式字符串。格式与plot()函数的格式字符串相同,如 ‘o-‘, ‘s–‘ 等。使用 ‘none’(不区分大小写)来绘制不带任何数据标记的误差棒。

  • ecolor误差棒线条的颜色。如果为 None,则使用连接标记的线条的颜色。

  • elinewidth误差棒线条的宽度。如果为 None,则使用当前样式(style)的线宽。

  • capsize误差棒端帽(cap)的长度(以点为单位)。

  • barsabove如果为 True,将在绘图符号的上方绘制误差棒。默认为下方。

  • lolims、uplims、xlolims、xuplims这些参数用于指示某个值仅给出上限/下限。在这种情况下,会使用一个尖角符号 (^ 或 v) 来表示。其中,lolims/uplims参数对应 y 值的下限/上限,此时只会绘制向上/向下的箭头xlolims/xuplims参数对应 x 值的下限/上限,此时只会绘制向/向的箭头lims 参数可以是标量,也可以是与 xerr和 yerr长度相同的数组。

  • errorevery在数据的子集上绘制误差棒。若errorevery = N表示在点 (x[::N], y[::N])上绘制误差棒;若errorevery = (start, N)表示在点 (x[start::N], y[start::N])上绘制误差棒。例如 errorevery=(6, 3)会在 (x[6], x[9], x[12], x[15], …)等位置添加误差棒。常用于当两个数据序列共享 x 轴值时,避免误差棒重叠。

  • capthick关键字参数 markeredgewidth(又名 mew)的别名。控制误差条端点横线的粗细(单位:点)。若同时设置markeredgewidth,会覆盖capthick

  • data如果提供,以下参数也可以接受字符串 s,如果 s是 data中的键,则会被解释为 data[s]

通过调整这些参数,可以灵活控制误差条的视觉效果。

# 模拟数据
x = [20, 30, 40, 50, 60]
y = [1.2, 2.5, 3.8, 4.2, 5.1]
y_err = [0.2, 0.3, 0.25, 0.4, 0.35]

plt.figure(figsize=(10, 6))
# 绘制误差条图
plt.errorbar(
            x,                      # x轴数据
            y,                      # y轴数据
            yerr=y_err,             # y方向的误差范围
            fmt='o-',               # 样式控制
            capsize=6,              # 误差条两端帽子的长度(单位:点)
            lolims=True,            # 仅显示y轴误差的下限(只绘制向上的箭头)
            linewidth=2,            # 数据点连接线的宽度
            elinewidth=5,           # 误差条线条的宽度
            markersize=12,          # 数据点标记的大小
            markerfacecolor='red',  # 数据点标记的填充颜色
            markeredgecolor='k',    # 数据点标记的边缘颜色
            markeredgewidth=2,      # 数据点标记的边缘宽度
            color='blue',           # 数据点连接线的颜色
            ecolor='purple'         # 误差条的颜色
            )

plt.title('基础误差条图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.show()

可视化结果如下图所示:


02

使用示例


  • 示例 1:双向误差条+非对称误差条

在某些场景中,数据的上下误差可能不相等(如产品重量的允许偏差为上限 0.5g,下限 0.3g),此时可通过二维数组设置不对称误差,第一行代表每个数据点的 “向下误差”,第二行代表 “向上误差”。另外,在需要同时展示 x 轴和 y 轴误差的场景(如物理实验中 “时间测量误差” 和 “距离测量误差”),可同时设置xerryerr参数,此时 x 轴与 y 轴将同时显示误差。

# 创建数据
x = np.linspace(0, 10, 10)
y = np.sin(x)
y_err = np.random.uniform(0.1, 0.3, size=10)
x_err = np.random.uniform(0.2, 0.4, size=10)

# 创建图形
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 子图1:双向误差条
ax1.errorbar(x, y, 
             xerr=x_err,    # x方向的误差范围
             yerr=y_err,    # y方向的误差范围
             fmt='o'
             capsize=5, 
             capthick=2, 
             ecolor='red',
             alpha=0.7, 
             label='数据点'
            )
ax1.set_title('双向误差条')
ax1.legend()

# 子图2:非对称误差条
y_err_lower = [0.1, 0.2, 0.1, 0.3, 0.2, 0.1, 0.2, 0.3, 0.1, 0.2]
y_err_upper = [0.3, 0.4, 0.2, 0.5, 0.3, 0.4, 0.3, 0.4, 0.2, 0.3]
# 组合成非对称误差的二维数组([下限误差, 上限误差])
asymmetric_error = [y_err_lower, y_err_upper]

ax2.errorbar(x, y, 
             yerr=asymmetric_error,    # 使用非对称误差(仅y方向)
             fmt='s',
             capsize=4, 
             ecolor='green'
             alpha=0.7
            )
ax2.set_title('非对称误差条')

plt.tight_layout()
plt.show()
可视化结果如下图所示:

  • 示例 2:根据返回值修改样式

errorbar()函数返回一个 ErrorbarContainer 对象,该容器包含:

  • plotline: 代表数据点及连线的 Line2D 对象,可以修改颜色、线宽、标记样式等。常用方法包括set_color()、set_linewidth()、set_marker()

  • caplines: 一个包含误差线帽子的 Line2D 对象元组(通常有两个元素),需要通过循环遍历列表修改每个帽子的样式,常用方法包括set_color()、set_markersize()、set_markeredgewidth()

  • barlinecols: 一个包含绘制了水平和垂直误差线的 LineCollection 对象的元组,需要循环遍历修改线条颜色、样式、宽度等,常用方法包括set_color()set_linestyle()set_linewidth()

通过返回值修改样式的方法,比在errorbar()函数中直接设置参数更灵活,尤其适合需要对图表各部分进行精细调整的场景。例如,可以单独修改 x 轴和 y 轴误差条的样式,或者根据数据特征动态调整不同部分的外观。

# 生成示例数据
x = np.linspace(0, 10, 6)
y = np.sin(x)
yerr = 0.2 + 0.1 * np.sqrt(x)
xerr = 0.5 + 0.05 * x

# 创建2个子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5), dpi=100)
fig.suptitle('误差条图样式修改前后对比', fontsize=16, y=1.05)

# 第一个子图:原始样式
ax1.set_title('修改前', fontsize=14)
ax1.errorbar(
    x, y, 
    xerr=xerr, yerr=yerr,
    fmt='o-',  
    capsize=4  
)
ax1.set_xlabel('X轴', fontsize=12)
ax1.set_ylabel('Y轴', fontsize=12)
ax1.grid(alpha=0.3)

# 第二个子图:修改后样式
ax2.set_title('修改后', fontsize=14)
plotline, caplines, barlinecols = ax2.errorbar(
    x, y, 
    xerr=xerr, yerr=yerr,
    fmt='o-'
    capsize=4 
)

# 修改数据线和数据点样式
plotline.set_color('#2c7fb8')             # 数据线颜色
plotline.set_linewidth(2)                 # 数据线宽度
plotline.set_marker('D')                  # 数据点标记
plotline.set_markersize(8)                # 数据点大小
plotline.set_markerfacecolor('#ff7f0e')   # 数据点填充色
plotline.set_markeredgewidth(2)           # 数据点边缘宽度

# 修改误差条帽子样式
forcapin caplines:
    cap.set_color('#d95f02')              # 帽子颜色
    cap.set_markersize(20)                # 帽子大小
    cap.set_markeredgewidth(2)            # 帽子线宽

# 修改误差条线条样式
for bar in barlinecols:
    bar.set_color('#1b9e77')              # 误差条颜色
    bar.set_linestyle('-.')               # 误差条线条样式
    bar.set_linewidth(3)                  # 误差条线宽

ax2.set_xlabel('X轴', fontsize=12)
ax2.set_ylabel('Y轴', fontsize=12)
ax2.grid(alpha=0.3)

plt.tight_layout()
plt.show()
可视化结果如下图所示:



更多内容可以前往官网查看

https://matplotlib.org/stable/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments