ゆるふわめも

東京か京都にいます。

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

たまによく使うので. matplotlibでのグラフ・プロットの作成のさいのラベルの表示例.

データを生成

ダミーのデータを2000こ生成します.

#!/usr/bin/env python
# -*- coding: utf-8 -*-00
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 で場所を指定.

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='uppper 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を調整して決定します.

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='uppper 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='uppper 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

その他

ドキュメント

legend and legend_handler — Matplotlib 2.0.0 documentation

フォントの変更・日本語をラベル名に用いる

paper.hatenadiary.jp