Matplotlib savefig() 関数
savefig()現在の Figure を画像ファイルとして保存するために使用し、PNG、PDF、SVG、EPS など複数の形式をサポートします。
これは Matplotlib の図表を共有可能でドキュメントに埋め込み可能なファイルとして書き出すための中心的なメソッドです。
関数定義
pyplot インターフェース
matplotlib.pyplot.savefig(fname, *, dpi='figure', format=None,
metadata=None, bbox_inches=None, pad_inches=0.1, facecolor='auto',
edgecolor='auto', backend=None, **kwargs)
Figure メソッド
Figure.savefig(fname, *, dpi='figure', format=None, metadata=None,
bbox_inches=None, pad_inches=0.1, facecolor='auto',
edgecolor='auto', backend=None, **kwargs)
パラメータの説明
| パラメータ | 型 | 説明 |
|---|---|---|
| fname | str または Path または file-like | 出力ファイル名またはファイルオブジェクト。拡張子が形式を自動的に決定します。例:'plot.png'、'plot.pdf'、'plot.svg' |
| dpi | float または 'figure' | 出力解像度(1インチあたりのドット数)。'figure' は Figure 自身の dpi を使用します。一般的な値:72(画面)、150(標準)、300(印刷) |
| format | str | 出力形式。例:'png', 'pdf', 'svg', 'eps', 'jpg'。指定しない場合はファイル名から推測されます。 |
| bbox_inches | str または Bbox | 切り抜き境界:'tight'(タイトなトリミング、余分な余白を削除)、None(Figure の元のサイズを使用) |
| pad_inches | float | bbox_inches='tight' の場合の内側の余白(インチ)。デフォルトは 0.1 |
| facecolor | color または 'auto' | 出力画像の背景色。'auto' は Figure の facecolor を使用します。 |
| edgecolor | color または 'auto' | 出力画像の枠線の色 |
| transparent | bool | True の場合、背景を透明にします(png/svg のみ) |
| metadata | dict | ファイルに書き込むメタデータ(一部の形式でサポート) |
必ず
plt.show()前に呼び出してくださいsavefig()。show() が Figure をクリアするためです。またはfig.savefig()Figure オブジェクトを指定します。
対応ファイル形式
| 形式 | 拡張子 | 特徴 |
|---|---|---|
| PNG | .png | ビットマップ、透明対応、最も一般的 |
| ベクター画像、出版物に適しており、LaTeX に埋め込み可能 | ||
| SVG | .svg | ベクター画像、ブラウザ/エディタで編集可能 |
| EPS | .eps | ベクター画像、伝統的な出版形式 |
| JPEG | .jpg / .jpeg | ビットマップ、非可逆圧縮、ファイルサイズが小さいが透明非対応 |
| TIFF | .tiff / .tif | ビットマップ、可逆圧縮、保存に適している |
使用例
例1:基本保存
実例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(x, np.sin(x), label='sin(x)')
ax.set_title('Save Figure Demo')
ax.legend()
# PNG として保存
fig.savefig('サンプル_plot.png')
print("サンプル: saved as サンプル_plot.png")
# PDF(ベクター)として保存
fig.savefig('サンプル_plot.pdf')
print("サンプル: saved as サンプル_plot.pdf")
plt.show()
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(x, np.sin(x), label='sin(x)')
ax.set_title('Save Figure Demo')
ax.legend()
# PNG として保存
fig.savefig('サンプル_plot.png')
print("サンプル: saved as サンプル_plot.png")
# PDF(ベクター)として保存
fig.savefig('サンプル_plot.pdf')
print("サンプル: saved as サンプル_plot.pdf")
plt.show()
例 2:高解像度出力 + タイトなトリミング
実例
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(8, 4))
x = np.linspace(0, 2*np.pi, 100)
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.set_title('High Resolution Output')
ax.set_xlabel('Angle (rad)')
ax.legend(loc='outside') # 凡例を外側に配置
# dpi=300: 高画質(印刷に適しています)
# bbox_inches='tight': 自動トリミングで凡例がはみ出さないようにします
fig.savefig('サンプル_hires.png', dpi=300, bbox_inches='tight')
print("サンプル: high-res image saved")
plt.show()
import numpy as np
fig, ax = plt.subplots(figsize=(8, 4))
x = np.linspace(0, 2*np.pi, 100)
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.set_title('High Resolution Output')
ax.set_xlabel('Angle (rad)')
ax.legend(loc='outside') # 凡例を外側に配置
# dpi=300: 高画質(印刷に適しています)
# bbox_inches='tight': 自動トリミングで凡例がはみ出さないようにします
fig.savefig('サンプル_hires.png', dpi=300, bbox_inches='tight')
print("サンプル: high-res image saved")
plt.show()
例 3:透明背景 + 異なる形式
実例
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(6, 4))
# 透明効果を示すために暗い背景を設定
fig.patch.set_facecolor('#2c3e50')
ax.set_facecolor('#34495e')
ax.plot(np.random.randn(100).cumsum(),
color='#1A6BBC', linewidth=2)
ax.set_title('Transparent Background',
color='white', fontsize=14)
ax.tick_params(colors='white')
# 透明背景 PNG
fig.savefig('サンプル_transparent.png',
transparent=True, # 透明背景
dpi=150, bbox_inches='tight')
# SVG も透明にできます
fig.savefig('サンプル_transparent.svg',
transparent=True,
bbox_inches='tight')
print("サンプル: transparent images saved")
plt.show()
import numpy as np
fig, ax = plt.subplots(figsize=(6, 4))
# 透明効果を示すために暗い背景を設定
fig.patch.set_facecolor('#2c3e50')
ax.set_facecolor('#34495e')
ax.plot(np.random.randn(100).cumsum(),
color='#1A6BBC', linewidth=2)
ax.set_title('Transparent Background',
color='white', fontsize=14)
ax.tick_params(colors='white')
# 透明背景 PNG
fig.savefig('サンプル_transparent.png',
transparent=True, # 透明背景
dpi=150, bbox_inches='tight')
# SVG も透明にできます
fig.savefig('サンプル_transparent.svg',
transparent=True,
bbox_inches='tight')
print("サンプル: transparent images saved")
plt.show()
例 4:複数のサブプロットを一括保存
実例
import matplotlib.pyplot as plt
import numpy as np
# 複数のチャートを含む大きな図を作成
data = np.random.randn(4, 100)
for i in range(4):
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(data[i].cumsum(), color=f'C{i}', linewidth=2)
ax.set_title(f'Series {i+1}')
ax.set_xlabel('Step')
ax.set_ylabel('Cumulative Sum')
ax.grid(True, alpha=0.3)
# インデックスを含むファイル名で一括保存
fig.savefig(f'サンプル_series_{i+1}.png',
dpi=200, bbox_inches='tight')
plt.close(fig) # 表示を避けるために閉じる
print("サンプル: 4 figures saved (series_1 to series_4)")
import numpy as np
# 複数のチャートを含む大きな図を作成
data = np.random.randn(4, 100)
for i in range(4):
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(data[i].cumsum(), color=f'C{i}', linewidth=2)
ax.set_title(f'Series {i+1}')
ax.set_xlabel('Step')
ax.set_ylabel('Cumulative Sum')
ax.grid(True, alpha=0.3)
# インデックスを含むファイル名で一括保存
fig.savefig(f'サンプル_series_{i+1}.png',
dpi=200, bbox_inches='tight')
plt.close(fig) # 表示を避けるために閉じる
print("サンプル: 4 figures saved (series_1 to series_4)")
よくある質問
保存した画像が真っ白になる?
savefig() が show() の後に呼び出されていないか確認してください。show() が Figure をクリアする可能性があります。
解決策:show() の前に savefig() を呼び出すか、またはfig.savefig()Figure オブジェクトを指定します。
画像内のテキスト/ラベルが切り取られる?
使用bbox_inches='tight'自動トリミングで、すべての要素が画像内に収まるようにします。
それでも問題がある場合は、増やすことができますpad_inchesパラメータ値。
その他の拡張