1. ホーム
  2. python

[解決済み] matplotlib: 同じグラフに2つの異なる凡例が表示される

2023-06-25 21:01:35

質問

異なるパラメータに異なる色が使われ、異なるアルゴリズムに異なる線のスタイルが使われたプロットがあります。目標は、同様のパラメータで実行された異なるアルゴリズムの結果を比較することです。つまり、合計で 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()

どのように解決するのですか?

matplotlib のドキュメントに、まさにこのテーマに関するセクションがあります。 .

以下は、あなたの具体的な例に対するコードです。

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)

以下はその出力例である。