web-dev-qa-db-ja.com

matplotlib:同じグラフ上の2つの異なる凡例

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

実際に、色に基づいて凡例を作成し、各色を対応するパラメーターに関連付けます。次に、同じグラフに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()
56
Charles Brunet

その正確な主題に関する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

75
Mu Mind

これを行うためのより「実践的な」方法もあります(つまり、Figureの軸と明示的に相互作用します)。

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のサイズに対して相対的に縮小し、凡例を表示します。

8
Maxime Beau