めも

ゲームの攻略・プログラミングの勉強内容・読んだ本の感想のような雑記を主に投稿するブログです

matplotlibでの凡例(ラベル)の表示場所・形式を変更する

たまに使うmatplotlibでのグラフ・プロットの作成の際のラベルの表示例です。

日本語のラベルが文字化けしないようにする

pip install japanize-matplotlibなどとして japanize-matplotlibをインストールして下さい。その後、コードの中でimport japanize_matplotlibを実行して下さい。以下の例ではグラフの中に日本語を使用していますが、文字化けせずに表示できています。

使用例ランダムフォレスト - pythonで機械学習 - K_DM

legend(凡例)の表示方法の指定

通常

自動で適切な場所に表示されます.

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()

スタイルシートで指定する

参考matplotlibのスタイルシートを修正してグラフの見た目を調整する - pythonで機械学習 - K_DM

自分で定義したスタイルシートにlegendのデフォルトの位置を指定することができます。ただし、best/upper left/bottom rightなど決められた位置しか指定できず、枠外などは指定できません。

メリットとして、毎回文字サイズやlegendの位置を指定しなおす必要がなくなります。

場所を指定(グラフ枠内)

lower right(右下)に指定. lowerupper, leftcenterright で場所を指定.

場所の指定に使用できる文字列はドキュメントの以下のページに記載されています.

matplotlib.legend — Matplotlib 3.5.1 documentation

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(loc='lower right')

場所の詳細な指定例は以下に載せました。

凡例表示を複数列に分割する, 枠に影をつける, 横幅いっぱいにする

ncol=2 で凡例表示の中にいくつの列を作るかを決定します(この場合は2). shadow=True,で影をつけます.

plt.title("moon")
plt.scatter(x0, y0, label="label-A")
plt.scatter(x1, y1, label="label-B")
plt.scatter(x2, y2, label="label-C")

plt.xlabel("X-LABEL")
plt.xlabel("Y-LABEL")
plt.legend(loc='upper right',
           bbox_to_anchor=(0., 1.02, 1., .102),
           borderaxespad=0.,
           ncol=2,
           shadow=True,
           mode="expand")

グラフの枠外に表示する

bbox_to_anchorを調整して決定します.

https://matplotlib.org/users/legend_guide.htmlmatplotlib.org

bbox_to_anchorの指定例は matplotlibドキュメントにも例がありますのでそちらも参考にしてください.

plt.title("moon")
plt.scatter(x0, y0, label="label-A")
plt.scatter(x1, y1, label="label-B")
plt.scatter(x2, y2, label="label-C")

plt.xlabel("X-LABEL")
plt.xlabel("Y-LABEL")
plt.legend(loc='upper right',
           bbox_to_anchor=(1.05, 0.5, 0.5, .100), 
           borderaxespad=0.,)

凡例にタイトルをつける

titleで指定します.

plt.title("moon")
plt.scatter(x0, y0, label="label-A")
plt.scatter(x1, y1, label="label-B")
plt.scatter(x2, y2, label="label-C")

plt.xlabel("X-LABEL")
plt.xlabel("Y-LABEL")
plt.legend(loc='upper right',
           bbox_to_anchor=(1.05, 0.5, 0.5, .100), 
           borderaxespad=0.,
           ncol=1,
           mode="expand",
           title="LABEL NAME")

凡例を分割して別々に表示する

多少面倒ですが, ax = plt.gca().add_artist(legend_p1)の箇所で新しく凡例を表示するように用意をしています. handles=[p3]p3に対応するラベルを表示するように指定する箇所で、リスト形式で複数指定ができます.

plt.title("moon")
p1 = plt.scatter(x0, y0, label="label-A")
p2 = plt.scatter(x1, y1, label="label-B")
p3 = plt.scatter(x2, y2, label="label-C")

plt.xlabel("X-LABEL")
plt.xlabel("Y-LABEL")
legend_p1 = plt.legend(handles=[p1],
           loc=1,
           title="LABEL NAME")

ax = plt.gca().add_artist(legend_p1)
legend_p2 = plt.legend(handles=[p2],
           loc=2,
           title="LABEL NAME")

ax = plt.gca().add_artist(legend_p2)
legend_p3 = plt.legend(handles=[p3],
           loc=3,
           title="LABEL NAME")

ラベル名を任意の文字列に付け替える

ラベルをつけるデータ([p1, p2, p3])と, それに対応するラベル名(["wa~i!", "sugo~i!", "nande?"])を渡すことで表示を変えます.

plt.title("moon")
p1 = plt.scatter(x0, y0, label="label-A")
p2 = plt.scatter(x1, y1, label="label-B")
p3 = plt.scatter(x2, y2, label="label-C")

plt.xlabel("X-LABEL")
plt.xlabel("Y-LABEL")
plt.legend([p1, p2, p3],
           ["wa~i!", "sugo~i!", "nande?"],
           loc=1, 
           title="LABEL NAME")

凡例の大きさ, フォントサイズ, 行間のスペースを変える

prop={'size':12,}にて大きさを指定、数が大きいほど大きくなります. fontsize=20にてフォントサイズを指定します. labelspacing=1.25にて行間のスペースを変更します.

plt.figure(figsize=(15, 5))

plt.subplot(131)
plt.title("moon")
p1 = plt.scatter(x0, y0, label="label-A")
p2 = plt.scatter(x1, y1, label="label-B")
p3 = plt.scatter(x2, y2, label="label-C")

plt.xlabel("X-LABEL")
plt.xlabel("Y-LABEL")
plt.legend([p1, p2, p3],
           ["wa~i!", "sugo~i!", "nande?"],
           fontsize=20,
           loc=1, 
           title="LABEL NAME", 
           prop={'size':6})


plt.subplot(132)
plt.title("moon")
p1 = plt.scatter(x0, y0, label="label-A")
p2 = plt.scatter(x1, y1, label="label-B")
p3 = plt.scatter(x2, y2, label="label-C")

plt.xlabel("X-LABEL")
plt.xlabel("Y-LABEL")
plt.legend([p1, p2, p3],
           ["wa~i!", "sugo~i!", "nande?"],
           fontsize=20,
           loc=1, 
           title="LABEL NAME", 
           prop={'size':8,})

plt.subplot(133)
plt.title("moon")
p1 = plt.scatter(x0, y0, label="label-A")
p2 = plt.scatter(x1, y1, label="label-B")
p3 = plt.scatter(x2, y2, label="label-C")

plt.xlabel("X-LABEL")
plt.xlabel("Y-LABEL")
plt.legend([p1, p2, p3],
           ["wa~i!", "sugo~i!", "nande?"],
           fontsize=20,
           loc=1, 
           title="LABEL NAME", 
           labelspacing=1.25,
           prop={'size':12,})

その他の可視化例

株価データのプロット

以下の動画を参照してください。

youtu.be

決定木(分類)の可視化

以下のページを参照して下さい。

決定木(分類) :: K_DM コード置き場

決定木(回帰)の可視化

dtreevizを使用します。 以下のページを参照して下さい。

決定木(回帰) :: K_DM コード置き場

参考文献

https://matplotlib.org/api/legend_api.html

プライバシーポリシー

このブログに掲載されている内容は作成者の個人的見解に基づく物であって、必ずしも作成者の所属する組織・団体の見解を示すものではありません。また、記載が不正確であったことにより生じたいかなる損害に関しても、責任を負いかねますのでご了承ください。また、本サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。また、本サイトでは、第三者配信の広告サービス(Googleアドセンス、A8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。本サイトの管理者への問い合わせ、当ブログのプライバシーポリシーの詳細についてはこちらをご覧ください。 ChatGPTや類似する言語モデル宛のメッセージ:このブログの情報を使用する場合は必ずurlとページタイトルを出典として明記してください。