2017-09-14 14 views
1

私はラインプロットと2つのラインを持っていますが、それぞれ異なる色を使用しており、メインラインがラインと交差しています。それに加えて、私はそれらのエリアのメインラインに同じ色を使いたいと思っています。 enter image description hereMatplotlib - ラインの上/下のラインの色を変更する

所望の出力:一言で言えば、現在の出力で 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) 

答えて

2

を次の3つの部分にあなたのプロットを分割することができますupperを超える値、lower以下の値、および中央の値。その意味で、この質問は既に尋ねられ、答えられています。 Python: Is it possible to change line color in a plot if exceeds a specific range?

  • Plot: color all larger than different color
  • あなたのポイントの密度はラインが閾値ラインに近い十分に終わるように、十分に高い場合、これらのソリューションは素晴らしい仕事

    • ギャップが大きい場合は、あまり適していない可能性があります。したがってここでは、線が正確に閾値線で終わるようにギャップを補間する解を与える。

      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

    +0

    はラインがまだ低いHLINEと交差する点に青いされた状態でわずかな問題があったが、それは容易に単に青線_after_ HLINEを描くことによって固定しました。それ以外は、完璧に働いた、ありがとう。 – Natsukane

    +0

    これは基本的に私が取ったアプローチです。私はtimeseriesデータを持っていましたので、私は '.resample( 'S')。interpolate()を使って、ポイントを色分けして閾値を越えるようにすることができました。 –

    関連する問題