はじめに
ここでは,図と凡例のタイトルのフォントサイズを変更する方法を紹介します.
私の場合,正式な図のタイトルは,報告書に図番号をつけて図の下側に配置するのですが,同じような図のケースの判別ため,図のタイトルを挿入しています.この目的のため,matplotlibによる図タイトルのフォントは小さめにしたい.
また,凡例にタイトルをつけることもあるのですが,そのフォントサイズの制御方法がわからなくて,調べました.世の中には,同じようなことをやりたい人がいるものですね.
ここ:https://github.com/matplotlib/matplotlib/issues/8699
やっていること
それでは,図を見てみましょう.
Case-1: subplot(131)
以下の部分で,図全体のフォントサイズを 20 に,フォントファミリーを sans-serif に指定します.
fsz=20
plt.rcParams["font.size"] = fsz
plt.rcParams['font.family'] ='sans-serif'
これにより,軸の数字および凡例内のフォントサイズは 20 になり,図タイトルのフォントサイズはデフォルトで指定値 20 の 1.2 倍になっています.図タイトルの位置はデフォルトでは図の中央です.凡例の位置は,matplotlib は中央右を選びました.
Case-2: subplot(132)
以下を実行しました.
- 凡例位置を上左に設定
- 凡例内のフォントサイズを 10 に指定(flg=10)
- 図タイトルのフォントサイズを 20 に指定(fti=fsz)
- 図タイトルの位置を左寄せに指定
凡例と図タイトルに関する指定は以下の通り.
flg=10 # 凡例のフォントサイズ
fti=fsz # タイトルのフォントサイズ
......
......
plt.legend(loc='upper left',fontsize=flg,title='Function')
plt.title('Case-2',loc='left',fontsize=fti)
ここで違和感があるのが,凡例のタイトルのフォントが大きすぎる!
これをなんとか制御したい.
Case-3: subplot(133)
凡例のタイトルのフォントサイズを指定する方法が以下の部分.変数 lg
に凡例を描く部分を取得し,タイトル部分のフォントサイズを再指定するという処理のようです.
lg=plt.legend(loc='upper left',fontsize=flg,title='Function')
lg.get_title().set_fontsize(flg)
これでやりたいことができました.
一行でもいけるようです.
plt.legend(loc='upper left',fontsize=flg,title='Function').get_title().set_fontsize(flg)
プログラム全文
プログラムを以下に示します.
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 100, endpoint=True)
c, s, t = np.cos(x), np.sin(x), -np.tanh(x)
fig=plt.figure(figsize=(14,4),facecolor='w')
fsz=20
plt.rcParams["font.size"] = fsz
plt.rcParams['font.family'] ='sans-serif'
plt.subplot(131)
plt.plot(x, c, label='cos')
plt.plot(x, s, label='sin')
plt.plot(x, t, label='-tanh')
plt.legend(title='Function')
plt.title('Case-1 (default)') # デフォルトではフォントサイズは1.2倍?
flg=10 # 凡例のフォントサイズ
fti=fsz # タイトルのフォントサイズ
plt.subplot(132)
plt.plot(x, c, label='cos')
plt.plot(x, s, label='sin')
plt.plot(x, t, label='-tanh')
plt.legend(loc='upper left',fontsize=flg,title='Function')
plt.title('Case-2',loc='left',fontsize=fti)
plt.subplot(133)
plt.plot(x, c, label='cos')
plt.plot(x, s, label='sin')
plt.plot(x, t, label='-tanh')
lg=plt.legend(loc='upper left',fontsize=flg,title='Function')
lg.get_title().set_fontsize(flg)
plt.title('Case-3',loc='left',fontsize=fti)
fnameF='fig_title2.png'
#plt.tight_layout()
plt.savefig(fnameF, dpi=200, bbox_inches="tight", pad_inches=0.1)
plt.show()
参考:tight_layoutの効果
コードではコメントにしてある plt.tight_layout()
のコメントを外すと以下のような図になります.図と図の間を少し開けてくれます.その分,軸数値の小数点がなくなりました.これについては欲しい数値をコード内で指定すれば良い.
以 上