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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3680閲覧

subplotでグラフを複数表示した時の凡例を一つにまとめたい

masukin

総合スコア34

Matplotlib

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/03 02:34

やりたいこと
matplotlibのsubplotでグラフを複数表示した際に、
凡例が何個も表示されてしまい、複数のグラフの下に1つだけ表示させたい。

読み込みたいcsvファイルの中身は以下の通りです。

|x|a|b|c|d|e|f|
|:--|:--:|--:|
|1|1|5| 9|13| 17|21|
|2|2|6| 10|14| 18|22|
|3|3|7| 11|15| 19|23|
|4|4|8| 12|16| 20|24|

import matplotlib.pyplot as plt import pandas as pd pd1 = pd.read_csv("1.csv") pd2 = pd.read_csv("2.csv") pd3 = pd.read_csv("3.csv") plt.figure(figsize=(10,10)) x = pd1.iloc[:, 0] for i in range(1, 7): y1 = pd1.iloc[:, i] y2 = pd2.iloc[:, i] y3 = pd3.iloc[:, i] plt.subplot(2, 3, i) plt.plot(x, y1, label = "legend1", color = "b") plt.plot(x, y2, label = "legend2", color = "r") plt.plot(x, y3, label = "legend3", color = "g") plt.tight_layout() plt.legend(loc = "lower center", bbox_to_anchor=(0.5, -0.3))

これを実行すると、以下のグラフが出力されますが、凡例がグラフごとに出力されてしまいます。
これを上の3列で1つ、下の3列で1つすつ、凡例が表示されるようにしたいです。

イメージ説明

Axes.get_legend_handles_labels() で、各AxesのHandleとLabelを取得して、
マージした後に Axes.legend(handles, labels)にて1つのAxesにて表示すればいいのは
わかるのですが、どうプログラムに組み込むかがわかりません。

どなたかわかる方がいましたら、よろしくお願いいたします。

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

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

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

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

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

meg_

2021/07/03 02:40

> Axes.get_legend_handles_labels() で、各AxesのHandleとLabelを取得して、マージした後に Axes.legend(handles, labels)にて1つのAxesにて表示すればいいのはわかるのですが、どうプログラムに組み込むかがわかりません。 凡例を表示したいグラフだけ表示させれば良いかと思うのですがそうしない理由があるのでしょうか?
masukin

2021/07/03 02:46

ご質問ありがとうございます。 凡例を表示したいグラフだけ表示させるには、どのように改変すべきでしょうか。 plt.tight_layout()の後に、 if i == 2 or 5: plt.legend(loc = "lower center", bbox_to_anchor=(0.5, -0.3)) を入れて、2個目、5個目だけ表示させようとしても、全部に凡例が表示されてしまいます。
meg_

2021/07/03 02:50

「if i == 2 or 5:」ではなく「if i == 2 or i == 5:」では?
masukin

2021/07/03 03:00

そうでした。ありがとうございます!!無事できました!
masukin

2021/07/03 04:22 編集

解決しました。申し訳ございません。 ありがとうございました
meg_

2021/07/03 04:22

> 何かいい方法ありましたら、教えていただけないでしょうか。 どうなれば良いのでしょうか?ちょっとイメージが分かりませんでした。
meg_

2021/07/03 04:24

本質問が「解決済」になっているので回答は付きにくいと思います。ご自身の回答を削除された方が良いかと思います。
masukin

2021/07/03 04:26

すみません、ありがとうございます。
guest

回答1

0

自己解決

if i == 2 or if == 5:
plt.legend(loc = "lower center", bbox_to_anchor=(0.5, -0.3))

で解決することができました。

投稿2021/07/03 03:00

編集2021/07/03 04:29
masukin

総合スコア34

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問