原则上你可以将你的图分成三个部分,上面的值upper
,下面的值lower
以及中间的值。从这个意义上说,这个问题已经被提出并回答了,例如
- Python:如果超出特定范围,是否可以更改图中的线条颜色?
- 情节:颜色都大于不同的颜色
如果您的点密度足够高,使得线条最终足够接近阈值线,那么这些解决方案效果很好。
如果间隙较大,它们可能不太适合。因此,我将在这里给出一个解决方案,该解决方案对间隙进行插值,以使线条恰好在阈值线处结束。
import numpy as np; np.random.seed(43)
import matplotlib.pyplot as plt
t = np.linspace(0,100,301)
x = np.cumsum(np.random.randn(len(t)))
lower,upper = 0,8
fig, ax=plt.subplots()
ax.axhline(lower, color="crimson")
ax.axhline(upper, color="limegreen")
def insertzeros(t, x, zero=0):
ta = []
positive = (x-zero) > 0
ti = np.where(np.bitwise_xor(positive[1:], positive[:-1]))[0]
for i in ti:
y_ = np.sort(x[i:i+2])
z_ = t[i:i+2][np.argsort(x[i:i+2])]
t_ = np.interp(zero, y_, z_)
ta.append( t_ )
tnew = np.append( t, np.array(ta) )
xnew = np.append( x, np.ones(len(ta))*zero )
xnew = xnew[tnew.argsort()]
tnew = np.sort(tnew)
return tnew, xnew
t1,x1 = insertzeros(t,x, zero=lower)
t1,x1 = insertzeros(t1,x1, zero=upper)
xm = np.copy(x1)
xm[(x1 < lower) | (x1 > upper)] = np.nan
ax.plot(t1,xm, color="C0")
xl = np.copy(x1)
xl[(x1 > lower)] = np.nan
ax.plot(t1,xl, color="crimson")
#
xu = np.copy(x1)
xu[(xu < upper)] = np.nan
ax.plot(t1,xu, color="limegreen")
ax.fill_between(t, x, lower, where=(x <= lower), facecolor="crimson", interpolate=True, alpha=0.5)
ax.fill_between(t, x, upper, where=(x >= upper), facecolor="limegreen", interpolate=True, alpha=0.5)
plt.show()