2016-06-22 6 views
2

私は単一のパラメータから来る複数の関数を視覚化しようとします。私はパラメータの上にある種のループをする必要があります。私は与えられたパラメータのすべてのプロットされた関数に同じ色、凡例などを割り当てたいと思います。matplotlibで同じプロパティを持つ複数の関数をプロットする

私が試したすべてのプロットは、matplotlibがさまざまな色を割り当てて、常にラベルを付けるという問題です。

import numpy as np 
import matplotlib.pyplot as plt 
def plot2():  
    fig, ax = plt.subplots() 
    x = np.arange(0,10,0.1) 
    ax.plot(x,1*np.sin(x),'b-') 
    ax.plot(x,1*np.cos(x),'b-',label='trig a={}'.format(1)) 
    ax.plot(x,2*np.sin(x),'g-') 
    ax.plot(x,2*np.cos(x),'g-',label='trig a={}'.format(2)) 
    ax.plot(x,3*np.sin(x),'r-') 
    ax.plot(x,3*np.cos(x),'r-',label='trig a={}'.format(3)) 
    ax.legend() 

が、関数のように:

def plotTrig(): 
    fig, ax = plt.subplots() 
    x = np.arange(0,10,0.1) 
    for a in [1,2,3]: 
     ax.plot(x,a*np.sin(x),x,a*np.cos(x),label='trig a={}'.format(a)) 
    ax.legend() 

上記のみに簡略化された例

Basicaly私のような何かをachiveしたいと思います。実際には、私ははるかに多くの関数とパラメータを持っているので、色の上にループを持つソリューションはあまり役に立ちません。

+0

x)、x、a * np.cos(x)、 '-ks'、label = 'trig a = {}'。値があるところでは、黒(k)、実線( - )の四角で、 '' -ks ''の追加に注目してください。あなたはそれをあなたが望むスタイルに変えることができ、すべてのプロットは同じスタイルになります。 – StefanS

+0

元の問題では、パラメータごとに10以上の関数が表示され、繰り返し処理では多くのパラメータが表示されます。色のハードコードは問題のいくつかを解決することができますが、場合によっては色のリストを使い果たします。もう一つの大きな問題は、すべての単一の機能には私が避けなければならない伝説があります。さらに、私はパラメータに応じて関数プロットに対して注釈をつけています。これはさらに補完します。 – Mus

答えて

1

私はあなたが欲しいものを理解していると思います。 matplotlibは幅広い色定義をサポートしているので、色が不足することはありません。任意のHTML名、RGB-トリプル、任意のRGB-トリプル、...

条件付きでアーティストのラベルを設定する方法がわからないので、次の部分(if)はハックですmatplotlibの内部作業についての知識が豊富な人によって改善されました。

import numpy as np 
import matplotlib.pyplot as plt 

def my_sin(x, a): 
    return a * np.sin(x) 

def my_cos(x, a): 
    return a * np.cos(x) 

def my_tanh(x, a): 
    return np.tanh(x/a - 1) 

def plotTrig(x, data, colors, parameters): 
    fig, ax = plt.subplots() 
    for ind, a in enumerate(parameters): 
     for name, func in data.iteritems(): 
      if (name == 'sin'): # or any other 
       ax.plot(x, func(x, a), '-', 
         color=colors[ind], 
         label='trig a={}'.format(a)) 
      else: 
       ax.plot(x, func(x, a), '-', 
         color=colors[ind]) 
    ax.legend() 


if __name__ == '__main__': 
    # prepare data 
    x = np.arange(0,10,0.1) 
    data = {} # dictionary to hold the values 
    data['sin'] = my_sin 
    data['cos'] = my_cos 
    data['tanh'] = my_tanh 
    # list to hold the colors for each parameter 
    colors = ['burlywood', 'r', '#0000FF', '0.25', (0.75, 0, 0.75)] 
    # parameters 
    parameters = [1, 2, 3, 4, 5] 
    plotTrig(x, data, colors, parameters) 
    plt.show() 

アイデアは、コンテナ内の異なる機能を置くことですので、我々はそれらを反復(リストが同様に働いていた)、その後、すべての機能のために同じ色を使用しますが、各パラメータに異なる色することができます。ラベルは、ハックされたifステートメントを含む1つの関数にのみ追加されます。

私はちょうど関数の結果に、辞書の値に設定したい場合にはずっと簡単にそれを行っている可能性:

data['sin'] = np.sin(x) 

をして、あなたの例を再現する

ax.plot(x, a * func, '-',... 

でプロットしかし、あなたのパラメータは関数の結果にしか適用できませんでした。この方法で、関数として表現できる方法でそれらを使用できます。

結果: `ax.plot(X、*のnp.sin(:あなたは同じ毎回たい場合は、単にプロット文で色をハードコードできない理由を私は理解していない Result

関連する問題