概要(グラフの保存は「見せたい品質で出力」を実現する最後の一歩)
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() は保存後に必要なら(保存前に呼ぶと何も描かれていないことがある)
Pythonpandasの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") # さらに余白を詰める
Pythontight_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)
Pythonpandasの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”で余白を詰め、背景・フォント・サイズを固定して再現性を担保する。出力先の管理とファイル名の規則化まで整えれば、初心者でも“配って恥ずかしくない”グラフを安定して納品できます。
