pythonのプロット作成ライブラリといえば、Matplotlib
が有名ですね。
Matplotlib
では、デフォルトでは凡例は表示されないのですが、どうしたらよいのでしょうか?
そこで、今回は…
Matplotlib
で凡例(legend
)を表示するにはどうしたらいいの?!- 凡例の位置や見た目の設定方法がわからない!
という方向けに、
- 凡例を表示する関数
plt.legend()
の使い方 plt.legend()
の引数で、凡例の位置や見た目を簡単に設定する方法
を紹介していきます。
plt.legend()
の基本をマスターすれば、自分の作りたい凡例を作れるようになってきます!
Matplotlibで凡例を表示するには?|plt.legend()の基本
Matplotlib
で凡例を表示させる最も簡単な方法を紹介します。
- プロット作成時にラベル名を指定する
plt.plot(x, y, label='label_name')
plt.legend()
で凡例を表示する
という手順を踏みます。
次のサンプルデータを使って凡例を表示する例を紹介します。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
サンプルデータはsinとcosの曲線です。ラベル名として、"sin(x)"
と"cos(x)"
を指定してみます。
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, label="cos(x)")
plt.legend()
plt.show()
グラフ内に凡例が表示されましたね。
- 【参考】
plt.plot()
の基本的な使い方はこちらの記事で紹介しています。
plt.plot()
ではなく、オブジェクト指向でグラフを描く場合には、
ax.legend()
またはfig.legend()
を実行します(fig
とax
を生成している場合)。
fig, ax = plt.subplots()
ax.plot(x, y1, label="sin(x)")
ax.plot(x, y2, label="cos(x)")
plt.legend()
plt.show()
- 【参考】
plt.subplots()
でのオブジェクト指向グラフ描画はこちらの記事で解説!
この記事内では、plt.legend()
を使用して、
- 凡例の位置調整
- 凡例内文字の設定
- 凡例の見た目の変更方法:
- 凡例のフレーム
- 凡例内マーカー
- 余白の詳細設定
について、紹介していきます。
引数はax.legend()
でも同様なので、オブジェクト指向の人はax.legend()
で実行してください。
凡例の位置調整
plt.legend()
を使用していると、凡例の位置調整方法がわからず混乱…ということがよくあります。
そこで、凡例の位置調整方法として、次の2つの方法を紹介します。
loc
で簡単設定bbox_to_anchor
で詳細設定
locで簡単位置調整
loc
プロパティで、凡例の位置を簡単に設定できます。
plt.legend(loc = "表示位置")
"表示位置"
としては、次の文字列または数値を指定できます。
表示位置 | 指定文字列" |
---|---|
自動設定 | "best" (デフォルト)グラフに最も被らない位置に自動調整 |
左上 | "upper left" |
上部中央 | "upper center" |
右上 | "upper right" |
中央左 | "center left" |
中央 | "center" |
中央右 | "center right" |
左下 | "lower left" |
下部中央 | "lower center" |
右下 | "lower right" |
サンプルとして、凡例の表示位置を左上から右下まで変更して表示してみます。
locs = ['upper left', 'upper center', 'upper right',
'center left', 'center', 'center right',
'lower left', 'lower center','lower right' ]
# 描画領域の調整、サブプロットのレイアウト自動調整
plt.figure(figsize = (8,10), tight_layout=True)
for i, loc in enumerate(locs):
# サブプロット作成
plt.subplot(4, 3, i+1)
plt.plot(x, y1, label="sin(x)", color = "lightblue")
# グラフタイトルの表示
plt.title(loc)
# 軸ラベルの非表示
plt.xticks([])
plt.yticks([])
# 凡例の表示
plt.legend(loc = loc)
plt.show()
loc
では、凡例を表示したい位置を指定するだけなので簡単に設定できます。
しかし、位置の微調整やグラフ外に表示することはできません。
その場合はbbox_to_anchor
を使用します。
サンプルコード内の各種設定については、次の記事を参考にしてください。
Figure
の設定、タイトルの表示について
- サブプロットの作成方法
- 軸ラベルの設定方法
bbox_to_anchorで詳細設定
凡例位置の詳細設定を行うには、bbox_to_anchor
を使用します。
loc
と組み合わせて、凡例を表示する座標を指定します。
bbox_to_anchor = (x ,y)
| 左下を(0, 0)
、右上を(1, 1)
とした座標loc
= "凡例の基準位置" | 凡例のどこを座標に合わせるか指定
ここでは、loc
は凡例の位置の指定ではなく、凡例のどこをbbox_to_anchor
の座標に合わせるかを指定しています。
loc
単体のときと挙動が異なるので注意が必要です。
bbox_to_anchor
の座標は、plt.legend()
、ax.legend()
のときは
Axes
(サブプロット領域)の左下が(0, 0)
、右上が(1, 1)
となります。
bbox_to_anchor
を利用すると、グラフの外側に凡例を配置することも可能です。
グラフ外 右上に凡例を表示する例
bbox_to_anchor = (1 ,1)
| グラフの右上を指定loc = "upper left"
| 凡例の左上を合わせる
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, label="cos(x)")
plt.legend(loc='upper left', bbox_to_anchor=(1, 1))
plt.show()
グラフ外 下中央に凡例を表示する例
bbox_to_anchor = (0.5 ,-0.1)
| グラフの下中央を指定loc = "center left"
| 凡例の中央左を合わせるncol = 2
| 凡例を2列で表示(ncol
については後述)
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, label="cos(x)")
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), ncol=2)
plt.show()
グラフ外 上中央に凡例を表示する例
bbox_to_anchor = (0.5 , 1)
| グラフの上中央を指定loc = "lower center"
| 凡例の下中央を合わせるncol = 2
| 凡例を2列で表示(ncol
については後述)
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, label="cos(x)")
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), ncol=2)
plt.show()
凡例内文字の設定
まずは凡例内の文字に関連する内容として、
- 凡例内の文字のスタイルを変更する方法
- 凡例にタイトルを表示/設定する方法
を紹介していきます。
文字の書式変更
キーワード引数で文字の書式を設定できます。
設定内容 | 引数名 | 設定値の例 |
---|---|---|
文字の大きさ | fontsize |
数値(pt) で指定 or 'small' , 'large' など名前で指定 |
文字の色(ver. 3.3以降) | labelcolor |
色の名前など ex) 'gray' , 'red' , 'blue' |
詳細設定 | prop |
{辞書型} で指定'familiy': 'フォント名' 'weight': 'bold'(太字) 'size': 数値 or '大きさ指定文字列' |
prop
は辞書型で渡して、'family'
(フォント), 'weight'
(太字), 'size'
(大きさ)など複数の書式を指定できます。
まずは、fontsize
とlabelcolor
を指定した例を紹介します。
plt.plot(x, y1, label="sin(x)")
plt.legend(fontsize="large",labelcolor="b")
plt.show()
次に、prop
を指定した例を紹介します。
plt.plot(x, y1, label="サインカーブ")
plt.legend( prop={"family":"Meiryo", "weight":"bold", "size": "xx-large"})
plt.show()
デフォルトでは日本語を表示できませんが、'family'
で日本語を表示できるフォントを指定すると表示できるようになります。
- 【参考】
Matplotlib
での日本語表示方法についてはこちらの記事で解説しています。
凡例にタイトル表示
凡例にタイトルを設定、表示サイズを設定する方法を紹介します。
設定内容 | 引数名 | 設定値の例 |
---|---|---|
タイトルの表示 | title |
"title_name" 文字列 |
タイトルの大きさ変更 | title_fontsize |
数値(pt) で指定 or 'small' , 'large' など名前で指定 |
実際にタイトルを設定してみましょう。
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, label="cos(x)")
plt.legend(title = "my_legend", title_fontsize = "large")
plt.show()
- 【参考】フォントサイズなど
Matplotlib
でのテキスト設定については、こちらの記事も参考にしてください。
凡例の見た目変更方法
凡例の見た目の変更方法を
- フレーム(凡例の表示領域)
- 凡例内のマーカー
- 余白(padding)の詳細設定
の順に紹介していきます。
フレーム(凡例の表示領域)の見た目
フレーム(凡例の表示領域)の見た目を変更できる引数を紹介します。
設定内容 | 引数名 | 設定値の例 |
---|---|---|
フレームの表示/非表示 | frameon |
True or False (デフォルト: True ) |
フレームの角を丸める | fancybox |
True or False (デフォルト: True ) |
フレームに影を付ける | shadow |
True or False (デフォルト: False ) |
背景色を変更 | facecolor |
色の名前など ex) 'gray' , 'red' , 'blue' |
背景の透明度を設定 | frame |
0 (完全透明)~1 (不透明) |
枠線の色を設定 | edgecolor |
色の名前など ex) 'gray' , 'red' , 'blue' |
凡例の列数を指定 | ncol |
数値 |
フレームを横方向に拡張 | mode |
'expand' :拡張 |
いくつかサンプルコードを紹介していきます。
フレームを非表示にすると、凡例の枠線などがなくなります。
plt.plot(x, y1, label="sin(x)")
plt.legend(frameon=False)
plt.show()
枠がない方がスマートに見える場合もありますね。
次に背景と枠線の色を設定してみましょう。
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, "-o", label="cos(x)")
plt.legend(framealpha = 0.2, facecolor="green" ,edgecolor="black")
plt.show()
【参考】Matplotlib
の色の設定については、こちらの記事で解説しています。
最後に凡例を横方向に拡大して、列数を2列にしてみます。
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, "-o", label="cos(x)")
plt.legend(loc = "lower center", ncol = 2, mode="expand")
plt.show()
グラフの全体に広がるような凡例を作成することができます。
凡例内のマーカーの見た目
凡例内のマーカーの見た目を設定する引数を紹介します。
設定内容 | 引数名 | 設定値の例 |
---|---|---|
マーカーの大きさ | markerscale |
数値 (デフォルト:1 ) |
マーカーの表示数 | numpoints |
数値 (デフォルト:1 ) |
マーカーの線の長さ | handlelength |
数値 (デフォルト:2 ) |
マーカー位置 | markerfirst |
True :テキスト前(デフォルト)False :テキスト後 |
いくつかサンプルコードを紹介していきます。
凡例のマーカーを大きくして、強調表示してみます。
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, "-o", label="cos(x)")
plt.legend(markerscale = 2, handlelength = 4)
plt.show()
線の長さは自動では調整されないので、handlelength
で線の長さも調整しています。
次にマーカーの表示数を増やしてみます。
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, "-o", label="cos(x)")
plt.legend(markerscale = 1, numpoints=3, handlelength = 5)
plt.show()
markerfirst=False
を指定して、マーカーをテキストの後ろに表示させてみます。
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, "-o", label="cos(x)")
plt.legend(markerfirst=False)
plt.show()
余白(padding)の詳細設定
凡例の余白方法を紹介します。
設定内容 | 引数名 | 設定値の例 |
---|---|---|
フレーム内側の余白 | borderpad |
数値 (デフォルト:0.4 ) |
フレーム外側の余白 | borderaxespad |
数値 (デフォルト:0.5 ) |
マーカー/テキスト間の余白 | handletextpad |
数値 (デフォルト:0.8 ) |
凡例の行間の余白 | labelspacing |
数値 (デフォルト:0.5 ) |
凡例の列間の余白 | columnspacing |
数値 (デフォルト:2 ) |
各引数の対応位置を画像にすると次のようになります。
余白を調整した例を紹介します。
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, "-o", label="cos(x)")
plt.legend(borderpad=3, labelspacing = 2, handletextpad = 2, borderaxespad=0)
plt.show()
Matplotlib日本語化のまとめ
今回はMatplotlib
で凡例を表示する方法を紹介しました。
plt.legend()
で表示- プロット作成時にラベル名を指定する(例:
label='label_name'
) plt.legend()
で凡例を表示する- 引数で文字の書式や凡例の見た目を設定可能
もっとMatplotlib
を自由自在に操作したい!という方へのおススメコンテンツはこちらです!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!