1. ホーム
  2. python

[解決済み] MatplotlibでPyPlotに凡例を追加する最も簡単な方法

2022-03-26 11:24:01

質問

<ブロッククオート

TL;DR -> で折れ線グラフの凡例を作成するにはどうしたらよいでしょうか。 Matplotlib 's PyPlot 余分な変数を作らずに?

以下のグラフスクリプトをご検討ください。

if __name__ == '__main__':
    PyPlot.plot(total_lengths, sort_times_bubble, 'b-',
                total_lengths, sort_times_ins, 'r-',
                total_lengths, sort_times_merge_r, 'g+',
                total_lengths, sort_times_merge_i, 'p-', )
    PyPlot.title("Combined Statistics")
    PyPlot.xlabel("Length of list (number)")
    PyPlot.ylabel("Time taken (seconds)")
    PyPlot.show()

ご覧の通り、これは非常に基本的な使用方法です。 matplotlib 's PyPlot . この場合、理想的には以下のようなグラフが生成されます。

何も特別なことはありませんね。しかし、どのデータがどこにプロットされているのかが不明です(私はいくつかのソートアルゴリズムのデータを、かかった時間に対する長さでプロットしようとしているのですが、どの線がどの線なのかがわかるようにしたいのです)。したがって、凡例が必要なのですが、以下の例を見てみると、( 公式サイトより ):

ax = subplot(1,1,1)
p1, = ax.plot([1,2,3], label="line 1")
p2, = ax.plot([3,2,1], label="line 2")
p3, = ax.plot([2,3,1], label="line 3")

handles, labels = ax.get_legend_handles_labels()

# reverse the order
ax.legend(handles[::-1], labels[::-1])

# or sort them by labels
import operator
hl = sorted(zip(handles, labels),
            key=operator.itemgetter(1))
handles2, labels2 = zip(*hl)

ax.legend(handles2, labels2)

追加の変数を作成する必要があることがわかります。 ax . グラフに凡例を追加するには なし 余計な変数を作成することなく、現在のスクリプトのシンプルさを維持することができるのでしょうか?

解決方法は?

を追加します。 label= をそれぞれの plot() を呼び出して、その後に legend(loc='upper left') .

このサンプルを考えてみましょう(Python 3.8.0でテスト済み)。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 20, 1000)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, "-b", label="sine")
plt.plot(x, y2, "-r", label="cosine")
plt.legend(loc="upper left")
plt.ylim(-1.5, 2.0)
plt.show()

このチュートリアルを少し修正したものです。 http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html