python3のmatplotlibでグラフを出力する時のグラフサイズの調整

普段プログラム中でmatplotlibを使うときは、随所でplt.plot()でプロットしてplt.show()で確認しつつplt.savefig(bbox_inches=’tight’)で保存してって感じで使っていることが多い。

それはそれでいいのだけど、いくつかの同じタイプの絵をまとめて他の人に見せようと思ったら微妙に軸の長さがずれている。なんでかなってみてたら、X軸のラベルのサイズで全体のスケールが変わっていた模様。これをどうしたら直せるのかと、bbox_inchesとtight_layoutのオプションをいじりながら遊んでみたのが今回の投稿。

……ってなことをやろうと思って書いてたんだけど、書き終わってみたらbbox_inchesを普通に使うんで問題なかった。悲しい。なんで最初の絵ずれてたんだろ、多分変なことしてたんだと思う。

rcParamsでまずは全体のプロットの外観調整

plt.rcParams['font.family']='Arial'
plt.rcParams['font.size']= 14
plt.rcParams['axes.linewidth']=2.5
plt.rcParams['xtick.major.width']=2.5
plt.rcParams['xtick.labelsize']=14
plt.rcParams['ytick.major.width']=2.5
plt.rcParams['ytick.labelsize']=14
plt.rcParams['figure.figsize']=(4,4)

rcParamsを使うのがいいのかは知らないけど、大体のセッティングを最初にできるので大概のプログラムでは突っ込んでいる。figsizeが基本的に絵のサイズ。

plotはまあなんでもいいのだけど、一応以下のようなプロット。一応subplotsを使う設定で。

#Xラベルの長さを変える
Title = ['aaa','bbb','ccc','ddd','eee','fff']
#Title2 = ['aaaaaa','bbbbbb','cccccc','dddddd','eeeeee','ffffff']
data1=np.array([165,201,224,158,178,207])
Err1=np.array([1,4,1,2,4,10])
data2=np.array([380,420,418,435,412,409])
Err2=np.array([10,19,12,20,18,34])
fig, ax1 = plt.subplots()
ax1.set_ylabel('y1',fontname='Arial')
ax1.errorbar(Title,data1,yerr=Err1,capsize=10,marker='o',ms=11,color='orange',fillstyle='none',linestyle = 'None')
ax2=ax1.twinx()
ax2.set_ylabel('y2',fontname='Arial')
ax2.errorbar(Title,data2,yerr=Err2,capsize=10,marker='D',ms=11,color='b',fillstyle='none',linestyle = 'None')

このプロット用の描画設定。

ax1.tick_params(axis ='x', which ='both', top='off',bottom='off', pad=10)
ax1.set_ylim(150,250)
ax1.set_yticks([150,200,250])
ax1.tick_params('x',labelrotation=90)
ax2.set_ylim(250,650)
ax2.set_yticks([200,400,600,800])

絵のセーブのオプションでサイズの最終調整。

bbox_inchesの場合。

fig.savefig('FIGURE/test1.png',bbox_inches='tight')

bbox_inchesでpad_inchesも0にして。

fig.savefig('FIGURE/test2.png',bbox_inches='tight',pad_inches=0)

tight_layoutを使って。

fig.tight_layout()
fig.savefig('FIGURE/test3.png')

ちなみにpyplotからplt.savefigにしても違いはない。

1個目。

test1

2個目。

test2

3個目

test3

 

というわけでbbox_inchesを使っておけば問題ない。

むしろtight_layourt()の方がラベルサイズとか揃ってないプロットにはよくなさげ。画像の全体サイズを合わせたいならこっちだけど。

下のように軸の高さ・幅を抜いて割らないとってなぜか最初に思ってたんだけど、別にそんなことはなかった。

width = ax1.figure.subplotpars.right-ax1.figure.subplotpars.left
height = ax1.figure.subplotpars.top-ax1.figure.subplotpars.bottom
ax1.figure.set_size_inches(4/width,4/height)

まあ、あとで何かに使えるかもしれないし、一応載せておく。任意の長さに軸サイズを調整したいって時なんかに使えるのかな。

うん、久しぶりにちょっと意味不明な投稿だ。

関連記事

1. pythonのまとめ

D