質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

3881閲覧

すでに描画されているグラフに凡例(ラベル)をつける方法について

退会済みユーザー

退会済みユーザー

総合スコア0

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/06/09 06:09

編集2019/06/09 06:39

前提・実現したいこと

すでに描画されているグラフに凡例(ラベル)をつけようとしています。
具体的には該当のソースコードのオレンジ色の線に「No.1」、緑色の線に「No.2」という具合です。

発生している問題・エラーメッセージ

以下のようなグラフをプロットしたのですが、データごとにラベルを付与してプロットしたわけではないので、グラフを描画した後で、凡例を付与する方法がわかりません。

該当のソースコード

python

1import matplotlib.pyplot as plt 2data = [[1,2,4,3,5,2], 3 [1,1,4,2,6,3], 4 [0, 2,5, 2,6,2]] 5plt.plot(data) 6plt.title("sample") 7plt.show()

出力グラフ

試したこと

参考記事にあるような、データをプロットする前に凡例名をつける方法はわかりましたが、今回のプログラムではデータ別に指定していないので、この方法は適用できません。

plt.title("moon") plt.scatter(x0, y0, label="label-A") plt.scatter(x1, y1, label="label-B") plt.xlabel("X-LABEL") plt.xlabel("Y-LABEL") plt.legend()

補足情報(FW/ツールのバージョンなど)

python3.6

###ご回答を受けての追記
dataが以下の変形を受けて作成された場合、凡例を付与するためのコードを実行しても出力が異なります。
型はどちらもlistですが、なぜ出力がちがうのか、またこのような変形を経て生成する場合のプロットはどのように修正すべきでしょうか。

python

1data = [1,2,4,3,5,2, 1,1,4,2,6,3, 0, 2,5, 2,6,2] 2data = np.array(data) 3data = data.reshape(-1, 6) 4 5data 6""" 7array([[1, 2, 4, 3, 5, 2], 8 [1, 1, 4, 2, 6, 3], 9 [0, 2, 5, 2, 6, 2]]) 10""" 11fig, ax = plt.subplots() 12ax.plot(data) 13ax.set_title("sample") 14 15# 凡例を設定する。 16labels = ["A", "B", "C", "D", "E"] 17ax.legend(ax.lines, labels) 18 19plt.plot() 20 21#出力 22[]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

axis.linesで各線がとれるので、それらに対しset_labelすることができます。

Python

1import matplotlib.pyplot as plt 2data = [[1,2,4,3,5,2], 3 [1,1,4,2,6,3], 4 [0, 2,5, 2,6,2]] 5plt.plot(data) 6 7axis = plt.gca() 8for idx, line in enumerate(axis.lines): 9 line.set_label('No.{}'.format(idx+1)) 10plt.legend() 11 12plt.title("sample") 13plt.show()

イメージ説明

投稿2019/06/09 06:33

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

matplotlib.axes.Axes.legend による凡例の作成方法には、以下の方式がありますので、これをお使いください。

legend(Artist のリスト, ラベルのリスト)

Artist は matplotlib で描画されるオブジェクトのことで、今回関心がある折れ線は Axes.lines で取得できます。

python

1print(ax.lines) 2# [<matplotlib.lines.Line2D at 0x7f5a3983f5c0>, 3# <matplotlib.lines.Line2D at 0x7f5a39781518>, 4# <matplotlib.lines.Line2D at 0x7f5a39781668>, 5# <matplotlib.lines.Line2D at 0x7f5a397817b8>, 6# <matplotlib.lines.Line2D at 0x7f5a39781908>, 7# <matplotlib.lines.Line2D at 0x7f5a39781a58>]

この各々が1つの折れ線を表す Artist オブジェクトなので、それに対応するラベル一覧を legend() の第2引数に渡してください。

コード全体

python

1import matplotlib.pyplot as plt 2 3data = np.array([1, 2, 4, 3, 5, 2, 1, 1, 4, 2, 6, 3, 0, 2, 5, 2, 6, 2]) 4data = data.reshape(-1, 6) 5print(data) 6# [[1 2 4 3 5 2] 7# [1 1 4 2 6 3] 8# [0 2 5 2 6 2]] 9 10fig, ax = plt.subplots() 11ax.plot(data) 12ax.set_title("sample") 13 14# 凡例を設定する。 15labels = ["A", "B", "C", "D", "E", "F"] 16ax.legend(ax.lines, labels) 17 18plt.show()

イメージ説明

matplotlib - legend() を使った凡例のカスタマイズ方法 まとめ

投稿2019/06/09 06:24

編集2019/06/09 07:03
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/09 06:40

ご回答いただきましてありがとうございます。 ご回答を受けての追記をさせていただきました。 よろしくお願いいたします。
tiitoi

2019/06/09 07:06

出力が違うというのは質問者さんの環境ではどう異なったのでしょうか? plt.plot() に2次元配列を渡した場合、各列が1つのデータとして解釈されます。 今回6列あるので、6個の折れ線が引かれます。 それに対して、ax.legend(ax.lines, ["1列目", "2列目", "3列目", "4列目", "5列目", "6列目"]) とラベル名を指定することで plot() を呼び出したあとに設定できます。
退会済みユーザー

退会済みユーザー

2019/06/09 07:09

#出力 [] と追記内で明記いたしましたが、わかりにくくて申し訳ございません。
tiitoi

2019/06/09 07:10

すいません。コードの最後が plt.plot() となっていたのですが、plt.show() でした。 plt.show() でグラフが表示されると思います。 回答のコードを修正しました。
退会済みユーザー

退会済みユーザー

2019/06/09 07:15

解決いたしました。 ありがとうございました。
guest

0

ラベルの扱いとか面倒臭いので、個人的にはpandas使ってプロットすると楽だと思います。
このようなコードはいかがでしょうか。

import matplotlib.pyplot as plt import pandas as pd df = pd.DataFrame({ 'label-A' : [1,2,4,3,5,2],'label-B' : [1,1,4,2,6,3]}) df.plot()

投稿2019/06/09 06:23

bamboo-nova

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問