2016-12-07 13 views
0

いくつかの単純なロジックに基づいてmatplotlibのラインカラーを変更する方法がわかりません。論理に基づいてmatplotlibの線の色を変更する

たとえば、のは、私が持っているとしましょう:

import numpy as np 
from matplotlib import pyplot as plt 

A = [1,2,3,4,5] 
B = [2,4,6,8,10] 
C = [1,3,5,6,7] 
D = [1,2,3,3,3] 
combined = [A,B,C,D] 

、のは、私が折れ線グラフとしてこれをプロットするためにmatplotlibのしたいとしましょう。したがって、各リストに基づいて4つの別々の行が結合されている必要があります。

リストの数値が5より大きい場合、条件を追加したい場合は、個々の行が青色であることを条件とします。そうでなければ、個々の線をオレンジ色にします。

どうすればこのようなことをやりますか?私はそれがちょうどうまくプロットすることを知っています。

np_combined = np.array(combined) 
times = np.linspace(0,1,5) 
plt.plot(times,np_combined.T) 

私は2重ループが必要でしょうか?私はいくつか以上を試みましたが、毎回エラーが発生するようです。あなたの試みに基づいて

+0

何を試しましたか?どのようなエラーがありましたか? – rassar

+0

私の試行で編集 – DudeWah

答えて

1

リテラル文字列を走査しながら、

for h in np_combined: 
    for k in range(5): 
     if k > 5: 
      plt.plot(times,k,color = 'blue') 
     else: 
      plt.plot(times,k,color = 'orange') 

エラーがEOLにある、試してみてください。

for sublist in np_combined: 
    if max(sublist) > 5: 
     plt.plot(times,sublist,color = 'blue') 
    else: 
     plt.plot(times,sublist,color = 'orange') 

をまた、あなたのエラーはあなたが終了引用符が欠落していることであるので、(それは何EOL手段です)、エラーはおそらく別の行にあります。

+0

それは素晴らしいです。私は最大を使用していない悲しいです。それはそれを解決する。 それは以下のようになります:plt.plot(times、sublist、color = 'b') – DudeWah

+0

あなたは正しいですか?答えが更新されます。 – rassar

2

rassar's answer、条件を使用して色(または描画スタイル)を選択するのは正しいです。単純なケースでは、それは完璧です。

さらに複雑なケースでは、自分のために自分自身を設定するために、別の選択肢があります:決定機能。これらは通常、d3jsBokeh、および視覚化アプリに表示されます。

簡単なケースでは、それはのようなものです:ここでcolor_choice

color_choice = lambda x: 'blue' if x > 5 else 'orange' 

for sublist in np_combined: 
    plt.plot(times, sublist, color=color_choice(max(sublist))) 

はまた、伝統的な関数定義である可能性があります。 lambda機能を使用するのは、それが短い1つのライナーだからです。

単純なケースでは、選択関数を定義することは、条件式よりもあまりよくない場合があります。しかし、ラインスタイルを定義し、色の選択と同じ条件を使用しないことも考えたとします。例えば:あなただけの比較的単純な色と線の選択のために多くのコードを持っているので、

for sublist in np_combined: 
    largest = max(sublist) 
    if largest > 5: 
     if largest > 10: 
      plt.plot(times, sublist, color='blue', ls='--') 
     else: 
      plt.plot(times, sublist, color='blue', ls='-') 
    else: 
     if largest <= 2: 
      plt.plot(times, sublist, color='orange', ls='.') 
     else: 
      plt.plot(times, sublist, color='orange', ls='-') 

今、あなたは、混乱漬物にしています。反復的なもので、ソフトウェアエンジニアリングの原則であるDRYに違反し、エラーを招いています。

意思決定機能が大幅にそれをクリーンアップすることができます:

color_choice = lambda x: 'blue' if x > 5 else 'orange' 

def line_choice(x): 
    if x > 10: return '--' 
    if x > 2: return '-' 
    return '.' 

for sublist in np_combined: 
    largest = max(sublist) 
    plt.plot(times, sublist, 
      color=color_choice(largest)), 
      ls=line_choice(largest)) 

を、これは意思決定ロジックをローカライズ、コードをクリーンアップするだけでなく、それが簡単にあなたのプログラムとしてあなたの色、スタイル、および他の選択を変更することができます進化する。この軟膏の唯一の飛行は、Pythonに欠けている、AFIAK、D3のexcellent selection of mapping functions, aka "scales"です。

+0

これはとても有益で、本当に将来私を助けます。明示的にすべてのことを書いていただきありがとうございます。 – DudeWah

関連する問題