Matplotlib - 改变hline上方/下方的线条颜色

时间:2017-09-14 07:42:17

标签: python-2.7 matplotlib

我有一个线图和2个hlines,全部使用不同的颜色,我填充主线与hline颜色交叉的区域。除此之外,我还想在这些区域使用相同的颜色作为主线。简而言之,目前的输出: enter image description here

期望的输出: enter image description here

我目前使用的相关代码:

lower, upper = 20, 80

self.indicatorPlot.axhline(lower, color="red")
self.indicatorPlot.axhline(upper, color="green")

self.indicatorPlot.plot(self.chartTimes, self.indicatorData, color="blue")

self.indicatorPlot.fill_between(self.chartTimes, self.indicatorData, lower, where=(self.indicatorData <= lower), facecolor="red", interpolate=True)
self.indicatorPlot.fill_between(self.chartTimes, self.indicatorData, upper, where=(self.indicatorData >= upper), facecolor="green", interpolate=True)

1 个答案:

答案 0 :(得分:4)

原则上,您可以将绘图分为三部分,upper以上的值,lower以下的值和中间的值。在这个意义上,这个问题已经被提出并回答,例如

如果您的点密度足够高,那么这些解决方案的效果会很好,这样线条最终会接近阈值线。

如果你有较大的差距,他们可能不太适合。因此,我将在这里给出一个解决方案,它会插入间隙,使得线条完全在阈值线处结束。

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()

enter image description here