3秒でわかる
matplotlib で描画用のキャンバスを新しく作る関数。サイズや解像度を指定し、グラフを何枚も別々に描き分けるときの起点になります。
もう少し詳しく
どういうものか
plt.figure は matplotlib で図全体の入れ物を作る関数です。ここで言う図とは、軸やタイトルや凡例を含めた1枚のキャンバス全体を指し、その中に置かれる個々のグラフ領域は軸 (Axes) と呼ばれます。figsize で横縦の大きさをインチで、dpi で1インチあたりの画素数を指定します。
plt.plot をいきなり呼んでも図は自動で作られますが、その場合は既定のサイズになり、複数枚を作り分けることもできません。
なぜ必要か
分析の結果をレポートやスライドに載せるとき、既定サイズのままだと軸ラベルが潰れたり、縦横比が内容と合わなかったりします。figure を先に呼んでおけば、出力する場所に合わせた寸法を最初に決められます。また、ループの中で複数のグラフを保存するとき、明示的に図を作らないと前の図に上書きされ、全部同じ絵になります。
具体例
サイズと解像度を指定して1枚描き、ファイルに保存する例です。
import matplotlib.pyplot as plt
months = ["1月", "2月", "3月", "4月"]
sales = [120, 180, 90, 210]
plt.figure(figsize=(8, 4), dpi=120)
<a href="/glossary/plt-bar" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">plt.bar</a>(months, sales)
plt.title("月別売上")
plt.ylabel("万円")
plt.savefig("sales.png", bbox_inches="tight")
plt.close()複数枚を独立して描くなら、1枚ごとに figure と close で挟みます。
for name, data in groups.items():
plt.figure(figsize=(6, 3))
<a href="/glossary/plt-plot" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">plt.plot</a>(data)
plt.savefig(f"{name}.png")
plt.close()つまずきやすいところ
plt.show のあとに plt.savefig を書くと、白紙の画像が保存されます。show の時点で現在の図が空になるためで、保存が先です。
ループで close を忘れると図がメモリに残り続け、20枚を超えたあたりで警告が出ます。処理が重くなる原因にもなります。
figsize の単位がインチである点も見落とされがちです。ピクセルで指定したい場合は、幅のピクセル数を dpi で割った値を渡します。1200ピクセル幅で dpi が120なら figsize=(10, ...) です。
似た用語との違い
plt.figure は入れ物を1つ作るだけ、plt.subplots は入れ物と軸をまとめて作り、fig と ax の2つを返します。1枚に複数のグラフを並べるなら subplots、単純に1枚だけ描くなら figure で足ります。オブジェクト指向の書き方に慣れるなら subplots から入るほうが後で楽です。