静かなる名辞

pythonとプログラミングのこと



【python】matplotlibで図の余白を調整する

 matplotlibで図を描画するとき、余白に納得がいかないことがある。

 調整方法を自分用にメモ。

余白の大きさを変える

 plt.subplots_adjust()を使うと余白を調整できる。

 ドキュメントによると、デフォルト値は以下の通り。

left  = 0.125  # the left side of the subplots of the figure
right = 0.9    # the right side of the subplots of the figure
bottom = 0.1   # the bottom of the subplots of the figure
top = 0.9      # the top of the subplots of the figure
wspace = 0.2   # the amount of width reserved for space between subplots,
               # expressed as a fraction of the average axis width
hspace = 0.2   # the amount of height reserved for space between subplots,
               # expressed as a fraction of the average axis height

matplotlib.pyplot.subplots_adjust — Matplotlib 3.0.0 documentation

 たとえば次のようなコードを実行すると、結果は下の図のようになる。わかりやすいように背景を着色している。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure()
plt.plot(x, y)
plt.savefig("result.png", facecolor="azure")

結果
結果

 余白を削れるだけ削ってみる。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure()
plt.plot(x, y)
plt.subplots_adjust(left=0, right=1, bottom=0, top=1)
plt.savefig("result.png", facecolor="azure")

結果
結果

 納得がいかないが、こうなるものは仕方ない。適当に調整する。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure()
plt.plot(x, y)
plt.subplots_adjust(left=0.1, right=0.95, bottom=0.1, top=0.95)
plt.savefig("result.png", facecolor="azure")

結果
結果

 それらしくなった。

余白をギリギリまで詰める

 plt.savefig()の引数でbbox_inches='tight', pad_inches=0を指定する。

 plt.subplots_adjust()で手動で調整しても良いけど、savefigでファイルに出力したい場合はこちらの方が実用的。論文やパワポに載せる図などを作る際に便利なのだと思う。

matplotlib.pyplot.savefig — Matplotlib 3.0.0 documentation

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure()
plt.plot(x, y)
plt.savefig("result.png", facecolor="azure", bbox_inches='tight', pad_inches=0)

結果
結果

subplotsの間の余白を調整する

 複数のグラフを描画しているときに、余白が狭くなることがよくある。図ごとにタイトルや軸ラベルを付けたりすると基本的にそうなる。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

fig, axes = plt.subplots(nrows=2, ncols=1)
axes[0].plot(x, y1)
axes[0].set_title("y = sin(x)")
axes[1].plot(x, y2)
axes[1].set_title("y = cos(x)")
plt.savefig("result.png")

y = cos(x)が上のx軸目盛りに食い込む
y = cos(x)が上のx軸目盛りに食い込む

 plt.subplots_adjust()で調整できる。wspaceが横方向、hspaceが縦方向の余白に対応。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

fig, axes = plt.subplots(nrows=2, ncols=1)
axes[0].plot(x, y1)
axes[0].set_title("y = sin(x)")
axes[1].plot(x, y2)
axes[1].set_title("y = cos(x)")
plt.subplots_adjust(hspace=0.4)
plt.savefig("result.png")

 このように改善する。

結果
結果