Python | データ処理:グラフの保存

Python
スポンサーリンク

概要(グラフの保存は「見せたい品質で出力」を実現する最後の一歩)

matplotlib(pandasのplotの裏側)なら、画像形式や解像度、余白、透明背景などを細かく制御して保存できます。初心者は「fig.savefigで保存」「dpiと形式(PNG/JPG/SVG/PDF)の違い」「余白の調整(bbox_inches=’tight’)」「出力前にplt.showを呼ばない」この4点を押さえるだけで、レポート品質が一気に安定します。


基本の保存(fig.savefig/plt.savefigの最小例)

最小例(pandas→matplotlibで保存)

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({"month": ["Jan","Feb","Mar","Apr"], "sales": [100,120,90,140]})

fig, ax = plt.subplots(figsize=(6,4))
df.plot(x="month", y="sales", kind="bar", ax=ax, color="#4e79a7", alpha=0.7)
ax.set_title("Monthly sales"); ax.set_ylabel("Sales"); ax.grid(True, axis="y", alpha=0.3)

fig.savefig("sales.png", dpi=200)   # 画像として保存(高解像度)
# plt.show() は保存後に必要なら(保存前に呼ぶと何も描かれていないことがある)
Python

pandasのplotでも、Axes(ax)を受け取って描けばfig.savefigで確実に保存できます。dpiで解像度を指定します。

plt.savefigでもOK(現在のFigureを保存)

plt.savefig("sales.jpg", dpi=200, quality=95)  # JPEGは品質指定が可能
Python

単一キャンバスならplt.savefigでも問題ありません。複数図面を扱う場合はfig.savefigを推奨します。


形式と解像度(PNG/JPG/SVG/PDFの選び方)

ラスタ形式(PNG/JPG)の使い分け

fig.savefig("chart.png", dpi=300)     # 印刷・スライド用は 200–300dpi が目安
fig.savefig("chart.jpg", dpi=200, quality=95)  # 写真寄り・軽量だが文字はやや滲みやすい
Python
  • PNGは可逆圧縮で線・文字が鮮明。レポート・Webに万能。
  • JPGは非可逆で軽いが、細い線や文字が劣化しやすい。

ベクタ形式(SVG/PDF)は拡大に強い

fig.savefig("chart.svg")  # Web・Illustrator修正向き
fig.savefig("chart.pdf")  # 印刷・文書埋め込み向き(ページに依存)
Python

拡大縮小しても劣化しないため、ロゴや線グラフ、印刷物に適します。画像埋め込みが多い場合はPDFが便利です。


余白・背景・文字の調整(仕上げの品質を決める)

余白を自動で詰める(凡例やラベルが切れない)

fig.tight_layout()  # 保存前に余白調整
fig.savefig("chart_tight.png", dpi=200, bbox_inches="tight")  # さらに余白を詰める
Python

tight_layoutでレイアウトを整え、bbox_inches=”tight”で枠いっぱいに保存します。長いラベルでも切れにくくなります。

透明背景や背景色の指定

fig.savefig("chart_transparent.png", transparent=True)         # 透過(スライド合成に便利)
fig.savefig("chart_white.png", facecolor="white")              # 背景色を明示
Python

背景を透過すると、スライドやWebで下地と馴染ませられます。紙面なら白背景を明示しておくと安心です。

フォント・サイズ・比率の安定化

import matplotlib as mpl
mpl.rcParams["font.size"] = 11
mpl.rcParams["figure.figsize"] = (6,4)  # デフォルト比率を固定
Python

毎回同じ見え方を再現したいならrcParamsで共通設定を固定します。本文と図の文字サイズを揃えるとレポートが美しく整います。


pandasプロットの安全な保存(AxesからFigureを取る)

Axes経由で保存(pandasの戻り値を活用)

ax = df.plot(kind="line", x="month", y="sales")
ax.set_title("Line chart")
ax.figure.savefig("line.png", dpi=200)
Python

pandasのplotはAxesを返すので、ax.figure.savefigで確実に保存できます。matplotlibを意識しなくても安全に扱えます。

サブプロットや二軸でも同じ

fig, (ax1, ax2) = plt.subplots(2,1, figsize=(7,5), sharex=True)
df.plot(x="month", y="sales", kind="bar", ax=ax1)
df.plot(x="month", y="sales", kind="line", ax=ax2)
fig.savefig("multi.png", dpi=200, bbox_inches="tight")
Python

複数Axesのときは親Figureを保存します。bbox_inches=”tight”で上下の余白を詰めます。


実務の型(ファイル名・保存先・自動化・ノートブック)

保存先を安全に作る(Pathでディレクトリ管理)

from pathlib import Path
outdir = Path("output/charts")
outdir.mkdir(parents=True, exist_ok=True)
fig.savefig(outdir / "sales_2025-01.png", dpi=200)
Python

保存前に出力フォルダを作っておくと、環境差で壊れません。PathはOS差異を吸収します。

タイムスタンプで重複回避(自動レポート)

from datetime import datetime
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
fig.savefig(f"chart_{ts}.png", dpi=200)
Python

自動実行では上書き防止にタイムスタンプを付けます。後で並び替えや検索もしやすくなります。

Jupyterで“高解像度表示”+保存

# Jupyterのセル表示を高DPIに
%config InlineBackend.figure_format = 'retina'

fig.savefig("retina.png", dpi=300)
Python

ノートブックの埋め込み表示を美しくしつつ、ファイルは高解像度で保存します。

失敗しがちな順序を避ける

  • 保存は描画後(fig.savefig)に。plt.show()の前でも後でも保存できますが、描画が完了していることが前提です。
  • 連続保存時は新しいfigを作るか、plt.clf()/plt.close(fig)で図面をリセットしてメモリ・上書き事故を防ぎます。

仕上げのチェック(色・ラベル・凡例・サイズ)

読みやすさを最終確認

  • 軸ラベルに単位を含めているか(例:Sales (k JPY))
  • タイトルは短く具体的か
  • 凡例の重なりや被りがないか(loc指定や外出し)
  • 図のサイズが用途に合っているか(スライド横長、レポート縦長など)

書き出し形式の最適化

  • Web配信:PNG(透明が必要ならtransparent=True)
  • 印刷・DTP:PDF/SVG(ベクタ)、画像混在はPDFが扱いやすい
  • 大量配布・サイズ重視:JPG(品質95前後、文字劣化に注意)

まとめ(「fig.savefigで保存」「形式とdpiを選ぶ」「余白と背景を整える」だけで劇的に良くなる)

保存はグラフの品質を決める最終工程です。Axesに描いてfig.savefigで確実に出力し、用途に合わせて形式(PNG/JPG/SVG/PDF)とdpiを選ぶ。tight_layoutとbbox_inches=”tight”で余白を詰め、背景・フォント・サイズを固定して再現性を担保する。出力先の管理とファイル名の規則化まで整えれば、初心者でも“配って恥ずかしくない”グラフを安定して納品できます。

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