めも

メモ.

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

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

追記:以下も参照してください。

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

はじめに、pip install japanize-matplotlibを実行してください。 特定のフォントを使用したい場合は、利用可能なフォントを探して個別に設定してください。

使用例で使うデータを生成

以下の例で使用するダミーのデータを2000こ生成します.

import matplotlib.pyplot as plt
import matplotlib.lines as mlines
import numpy as np
from sklearn.datasets import make_moons

data, label = make_moons(noise=0.2, n_samples=2000)
x0, y0 = data[label==0,0], data[label==0,1]
x1, y1 = data[label==1,0], data[label==1,1]
x2, y2 = -1*data[label==1,0], 2*data[label==1,1]

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

f:id:misos:20170502150559p:plain

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

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

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

matplotlib.legend — Matplotlib 3.3.4 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')

f:id:misos:20170502150812p:plain

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

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

f:id:misos:20170502151224p:plain

グラフの枠外に表示する

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.,)

f:id:misos:20170502151555p:plain

凡例にタイトルをつける

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

f:id:misos:20170502151546p:plain

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

多少面倒ですが, 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")

f:id:misos:20170502151507p:plain

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

ラベルをつけるデータ([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")

f:id:misos:20170502151812p:plain

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

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,})

f:id:misos:20170502152029p:plain

その他

ドキュメント

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

関連記事

プライバシーポリシー

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