首页 > 解决方案 > 在线图上绘制错误阴影带 - python

问题描述

假设我有 25 行这样的:

x = np.linspace(0, 30, 60)
y = np.sin(x/6*np.pi)
error = np.random.normal(0.1, 0.02, size=y.shape)
y1 = y+ np.random.normal(0, 0.1, size=y.shape)
y2= y+ np.random.normal(0, 0.1, size=y.shape)
plt.plot(x, y, 'k-')
plt.plot(x, y1, 'k-')
plt.plot(x, y2,'k-')
.
.
.

现在,我想制作这样的情节:在此处输入图像描述. 我如何自动制作这些误差线并只给一堆线条制作阴影,所有线条都具有相同的整体形状但略有不同。

标签: pythonmatplotlib

解决方案


我不太清楚代码示例中的错误变量与 y 变量的变化有何关系。因此,在这里我给出了一个示例,说明如何根据 25 个 y 变量的随机变化来计算和绘制误差带,并使用这些相同的变化在带的顶部创建 y 误差条。相同的逻辑适用于 x 轴上的变化/错误。

让我们首先创建一些随机数据,看看 25 条相似线的折线图是什么样子的:

import numpy as np                 # v 1.19.2
import matplotlib.pyplot as plt    # v 3.3.2

rng = np.random.default_rng(seed=1)

x = np.linspace(0, 5*np.pi, 50)
y = np.sin(x)
# error = np.random.normal(0.1, 0.02, size=x.shape) # I leave this out
nb_yfuncs = 25
ynoise = rng.normal(1, 0.1, size=(nb_yfuncs, y.size))
yfuncs = nb_yfuncs*[y] + ynoise

fig, ax = plt.subplots(figsize=(10,4))
for yfunc in yfuncs:
    plt.plot(x, yfunc, 'k-')

plt.show()

random_sine_functions


我使用的平均值yfuncs作为基线变量。我提取yfuncs每个 x 的最小值和最大值来计算误差带。我计算的误差条覆盖的范围与误差带相同。因此,误差相对于平均值是不对称的,这就是为什么它们在绘图函数中作为二维数组输入的原因。误差带用 绘制,fill_between误差条用绘制errorbar。代码如下所示:

ymean = yfuncs.mean(axis=0)
ymin = yfuncs.min(axis=0)
ymax = yfuncs.max(axis=0)
yerror = np.stack((ymean-ymin, ymax-ymean))

fig, ax = plt.subplots(figsize=(10,4))
plt.fill_between(x, ymin, ymax, alpha=0.2, label='error band')
plt.errorbar(x, ymean, yerror, color='tab:blue', ecolor='tab:blue',
             capsize=3, linewidth=1, label='mean with error bars')
plt.legend()

plt.show()

sine_functions_error_bars_and_band


推荐阅读