为了填充多条曲线的最小值和最大值之间,您需要确定表示曲线上每个点的最小值或最大值的数组。如果所有曲线共享相同的 x 值,则可以通过沿组合 y 值的一个轴取最小值来轻松完成此操作。例如。
np.min(np.c_[y1, y2, y3, ...], axis=1)
最大值相同。然后fill_between
可以与这些组合数组一起用作输入。
一个完整的例子:
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(4)
# generate some data to plot
x = np.linspace(0.8,10,201)
f = lambda x, p1,p2,p3,p4: p1/x + np.sinc(x*p4)*p3 + p2
Y = np.empty((len(x), 9))
P1 = 1.5+ (np.random.normal(size=9)-0.5)*0.2
P2 = np.linspace(0.9,1.1, 9)
P3 = 1+ (np.random.normal(size=9)-0.5)*0.2
P4 = np.linspace(0.9,1.1, 9)+ (np.random.normal(size=9)-0.5)
for i in range(9):
Y[:,i] = f(x,P1[i], P2[i], P3[i], P4[i])
# plot
fig, ax = plt.subplots()
style= [":"]*4 + ["-"] + ["--"]*4
colors = ["crimson"]*4 + ["k"] + ["#9a0bad"]*4
lw = np.ones(9); lw[4] = 2
for i in range(9):
ax.plot(x,Y[:,i], linestyle=style[i], label="curve "+str(i), lw=lw[i], color=colors[i])
Y1min = np.min(Y[:,:4], axis=1)
Y1max = np.max(Y[:,:4], axis=1)
Y2min = np.min(Y[:,5:], axis=1)
Y2max = np.max(Y[:,5:], axis=1)
ax.fill_between(x, Y1max, Y1min, color="crimson", alpha=0.4)
ax.fill_between(x, Y2max, Y2min, color="#9a0bad", alpha=0.4)
plt.show()