Python | ファイル・OS 操作:図保存

Python Python
スポンサーリンク

概要(図保存は「伝える場面に合わせた形式と解像度」を選ぶのが核心)

Matplotlibの図保存は、plt.savefig または fig.savefig を使って画像ファイルへ出力します。重要なのは「形式(PNG/PDF/SVG)」「解像度(dpi)」「余白(bbox_inches/pad_inches)」「背景の透明・色」「レイアウト調整(tight_layout/constrained_layout)」の5点です。まずは基本の保存を押さえ、用途に合わせて設定を切り替える型を身につけましょう。


基本の保存(ここが最短ルート)

pyplotスタイルでの保存

import matplotlib.pyplot as plt

x = [1,2,3,4]; y = [100,120,90,130]
plt.plot(x, y, marker="o")
plt.title("月別売上"); plt.xlabel("月"); plt.ylabel("売上(万円)")

plt.tight_layout()                          # 余白を自動調整
plt.savefig("sales.png")                    # PNGで保存
plt.show()
Python

最短は plt.savefig(“名前.拡張子”)。tight_layout を先に呼ぶと、タイトルやラベルが切れにくくなります。

オブジェクト指向スタイルでの保存

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(6,4))
ax.plot([1,2,3,4],[100,120,90,130], marker="o")
ax.set_title("月別売上"); ax.set_xlabel("月"); ax.set_ylabel("売上(万円)")

fig.tight_layout()
fig.savefig("sales.png")                    # figから直接保存
plt.show()
Python

複数サブプロットや高度な調整では fig.savefig が確実です。


解像度・余白・サイズ(見た目の品質を決める設定)

解像度(dpi)と余白(bbox_inches/pad_inches)

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1,2,3,4],[100,120,90,130]); ax.set_title("月別売上")

fig.tight_layout()
fig.savefig("sales_300dpi.png", dpi=300, bbox_inches="tight", pad_inches=0.2)
Python

dpi は印刷・配布品質を左右します。一般向けは 150〜200、印刷・資料なら 300 以上が目安。bbox_inches=”tight” は余白を詰め、pad_inches で必要分だけ追加します。

図サイズ(figsize)でそもそもの見やすさを整える

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8,5))
ax.plot([1,2,3,4],[100,120,90,130]); ax.set_title("大きめの図")
fig.savefig("large.png", dpi=150)
Python

小さい図を高dpiで無理に出すより、適切な figsize × 適度な dpi の方が文字の見切れや潰れを防げます。


形式の選び方(PNG・PDF・SVGの使い分け)

用途別の推奨形式

  • PNG: もっとも汎用。資料・Web・画像貼り付けに向く。透過背景も使いやすい。
  • PDF: ベクター形式で印刷・配布に強い。文字や線が拡大に強く、レイアウト崩れが少ない。
  • SVG: WebやIllustratorなどでの後編集に最適。ロゴ・アイコン・線画中心の図で威力を発揮。

形式の切り替えは拡張子だけでOK

fig.savefig("report.pdf")   # ベクター(PDF)
fig.savefig("chart.svg")    # ベクター(SVG)
fig.savefig("image.png")    # ラスター(PNG)
Python

同じ図を用途ごとに複数形式で保存すると後工程が楽になります。


背景・色・透明度・フォント(配布先に合わせた整え方)

透明背景や背景色の指定

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1,2,3,4],[100,120,90,130]); ax.set_title("透明背景")

fig.tight_layout()
fig.savefig("transparent.png", transparent=True)        # 背景透過
fig.savefig("white_bg.png", facecolor="white")          # 背景色指定
Python

資料テンプレートやWeb背景に合わせて、transparent や facecolor を使い分けます。

日本語フォントの設定(文字化け対策)

import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "DejaVu Sans"  # 実環境の日本語フォントに合わせて変更

fig, ax = plt.subplots()
ax.set_title("日本語タイトル"); ax.set_xlabel("月"); ax.set_ylabel("売上(万円)")
fig.savefig("jp.png", dpi=200)
Python

保存前にフォント設定を済ませておくと、画像でも文字化けを避けられます。


実務の型(ディレクトリ作成・ファイル名・大量生成の安定運用)

保存先ディレクトリを先に作る

from pathlib import Path
import matplotlib.pyplot as plt

out = Path("reports") / "sales.png"
out.parent.mkdir(parents=True, exist_ok=True)

fig, ax = plt.subplots()
ax.plot([1,2,3,4],[100,120,90,130])
fig.tight_layout(); fig.savefig(out, dpi=200)
Python

存在しないフォルダで失敗しないよう、Pathlibで親フォルダを作ってから保存します。

日付やパラメータをファイル名へ差し込む(上書き防止)

import datetime, matplotlib.pyplot as plt

ts = datetime.datetime.now().strftime("%Y%m%d_%H%M")
fname = f"sales_{ts}.png"

fig, ax = plt.subplots()
ax.plot([1,2,3,4],[100,120,90,130])
fig.tight_layout(); fig.savefig(fname, dpi=200)
Python

タイムスタンプを付けると、バージョン管理や比較がスムーズになります。

大量生成時のメモリ・表示管理(closeの徹底)

import matplotlib.pyplot as plt

for i in range(5):
    fig, ax = plt.subplots()
    ax.plot([1,2,3,4],[i, i+1, i+2, i+3])
    fig.savefig(f"plot_{i}.png", dpi=150)
    plt.close(fig)     # クローズしてメモリを解放
Python

大量の図を順次保存するスクリプトでは、plt.close を必ず呼んでメモリを守ります。


よくある落とし穴の回避(切れ・ぼやけ・色転び)

タイトルやラベルが切れる

  • 保存前に fig.tight_layout()、または bbox_inches=”tight”+pad_inches で余白を確保。
  • 文字が大きすぎる場合は fontsize を下げるか figsize を広げる。

ぼやけ・にじみ

  • ラスター(PNG/JPG)は dpi を上げる。ベクター(PDF/SVG)を選べるならそちらを使う。
  • 小さい図で高dpiを無理に掛けるより、図自体を適切なサイズに。

背景が合わない・色が転ぶ

  • 透明背景(transparent=True)か、facecolor で背景色を明示。
  • 企業カラーやテーマに合わせて色コード(#RRGGBB)で指定し、印刷で沈む色は避ける。

例題で身につける(定番から一歩先まで)

例題1:高解像度PNG+余白調整

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7,4))
ax.plot([1,2,3,4],[100,120,90,130], marker="o")
ax.set_title("月別売上"); ax.set_xlabel("月"); ax.set_ylabel("売上(万円)")

fig.tight_layout()
fig.savefig("sales_hd.png", dpi=300, bbox_inches="tight", pad_inches=0.2)
Python

例題2:PDFとPNGを同時保存(印刷+配布)

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.bar(["A","B","C","D"], [10,12,9,15])
ax.set_title("製品別数量")

fig.tight_layout()
fig.savefig("products.pdf")     # 印刷向け(ベクター)
fig.savefig("products.png", dpi=200)  # 配布向け(ラスタ)
Python

例題3:透明背景で資料へ自然に合成

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.scatter([1,2,3,4],[2,3,2,5], color="tab:blue")
ax.set_title("散布図")

fig.tight_layout()
fig.savefig("scatter_transparent.png", transparent=True, dpi=200)
Python

例題4:Pathlibで安全にフォルダ作成→保存

from pathlib import Path
import matplotlib.pyplot as plt

outdir = Path("exports") / "2025Q4"
outdir.mkdir(parents=True, exist_ok=True)

fig, ax = plt.subplots()
ax.plot([1,2,3,4],[30,25,35,20], marker="o")
fig.tight_layout(); fig.savefig(outdir / "profit.png", dpi=200)
Python

まとめ

図保存は「形式・解像度・余白・背景・レイアウト」をセットで整えるのが要点です。最短は savefig、品質は dpi と bbox_inches、配布先に合わせた形式選択(PNG/PDF/SVG)が効きます。tight_layout で文字の切れを防ぎ、必要なら透明背景や背景色を指定。Pathlibで保存先を用意し、タイムスタンプで上書き防止、連続保存では close でメモリを守る。これらの型を身につければ、初心者でも「見やすく、配布しやすい」図を安定して作れます。

タイトルとURLをコピーしました