2012-10-06 40 views
37

私は、さまざまなパラメータに異なる色が使用され、さまざまなアルゴリズムに異なる線スタイルが使用されるプロットがあります。目標は、類似のパラメータで実行された異なるアルゴリズムの結果を比較することです。つまり、4つの異なる色と3つの異なる線種を使用して、同じグラフ上に合計12個の図を表示します。matplotlib:同じグラフの2つの異なる凡例

実際に色に基づいて凡例を作成し、各色を対応するパラメータに関連付けます。今、私は、同じグラフ上に、それぞれの線スタイルの意味とともに、2番目の凡例を表示したいと思います。これを達成することは可能ですか?どうやって?ここで

は私のコードが実際にどのように見えるかです:

colors = ['b', 'r', 'g', 'c'] 
cc = cycle(c) 
for p in parameters: 

    d1 = algo1(p) 
    d2 = algo2(p) 
    d3 = algo3(p) 

    pyplot.hold(True) 
    c = next(cc) 
    pyplot.plot(d1, '-', color=c, label="d1") 
    pyplot.plot(d1, '--', color=c) 
    pyplot.plot(d2, '.-', color=c) 

pyplot.legend() 

答えて

53

その正確なテーマに関するmatplotlibのドキュメントのセクションがあります:http://matplotlib.org/users/legend_guide.html#multiple-legends-on-the-same-axes

はここにあなたの具体的な例のコードです:

import itertools 
from matplotlib import pyplot 

colors = ['b', 'r', 'g', 'c'] 
cc = itertools.cycle(colors) 
plot_lines = [] 
for p in parameters: 

    d1 = algo1(p) 
    d2 = algo2(p) 
    d3 = algo3(p) 

    pyplot.hold(True) 
    c = next(cc) 
    l1, = pyplot.plot(d1, '-', color=c) 
    l2, = pyplot.plot(d2, '--', color=c) 
    l3, = pyplot.plot(d3, '.-', color=c) 

    plot_lines.append([l1, l2, l3]) 

legend1 = pyplot.legend(plot_lines[0], ["algo1", "algo2", "algo3"], loc=1) 
pyplot.legend([l[0] for l in plot_lines], parameters, loc=4) 
pyplot.gca().add_artist(legend1) 

出力の例を次に示します。 Plot with 2 legends, per-param and per-algo

+1

キーは 'add_artist'にあります...あなたが元の凡例をよく知っていると判断した場合、後でそれを再び追加する必要があるという狂った理由のために、matplotlibはそれを判断します。助けてくれてありがとう、私はビールを持って行くつもりです。 –

5

これを行う「手作業」の方法もあります。 )任意の数値軸を明示的に相互作用:

import itertools 
from matplotlib import pyplot 

fig, axes = plt.subplot(1,1) 

colors = ['b', 'r', 'g', 'c'] 
cc = itertools.cycle(colors) 
plot_lines = [] 
for p in parameters: 

    d1 = algo1(p) 
    d2 = algo2(p) 
    d3 = algo3(p) 

    c = next(cc) 
    axes.plot(d1, '-', color=c) 
    axes.plot(d2, '--', color=c) 
    axes.plot(d3, '.-', color=c) 

# In total 3x3 lines have been plotted 
lines = axes.get_lines() 
legend1 = pyplot.legend([lines[i] for i in [0,1,2]], ["algo1", "algo2", "algo3"], loc=1) 
legend2 = pyplot.legend([lines[i] for i in [0,3,6]], parameters, loc=4) 
axes.add_artist(legend1) 
axes.add_artist(legend2) 

私はそれがあまり目立たない方法で異なる軸と遊ぶのが潜在的に可能であるため、それを書いているこの方法が好き。最初に凡例のセットを作成し、メソッド "add_artist"で必要な軸に追加することができます。また、私はmatplotlibを使い始めています。少なくとも、オブジェクトが明示されたときにスクリプトを理解する方が簡単です。

注意:表示/保存中に凡例が切れることがあるので注意してください。この問題を解決するには、axes.set_position([left、bottom、width、length])メソッドを使用して、サブプロットをFigureのサイズに合わせて縮小し、凡例を表示させます。

関連する問題