我不太清楚代码示例中的错误变量与 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()
我用的意思是yfuncs
作为基线变量。我提取了最小值和最大值yfuncs
对于每个 x 计算误差带。我计算的误差线覆盖与误差带相同的范围。因此,误差相对于平均值是不对称的,这就是为什么它们在绘图函数中作为二维数组输入的原因。误差带绘制为fill_between https://matplotlib.org/gallery/lines_bars_and_markers/fill_between_demo.html和误差线errorbar https://matplotlib.org/gallery/statistics/errorbar.html。代码如下:
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()