YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

matplotlib 画像の保存方法|savefigの使い方

Pythonのデータ可視化ライブラリといえば、Matplotlibですね。

Matplotlibで作成した画像は様々なファイル形式で保存することができます。

しかし、実際に画像を保存しようとすると、次のような問題に直面することも…

  • 画像として保存するにはどのメソッドを実行すればいいの?
  • ファイルの種類を指定することはできる?
  • 画像の見た目を調整してから保存したい!

この記事では、Matplotlib.savefig()を使って画像を保存する方法について、分かりやすく解説していきます。

savefig()による画像の保存方法

Matplotlibで作成したプロットを保存するには、plt.savefig()を使用します。

次のようにファイル名と拡張子を指定します。

  • plt.savefig('ファイル名.拡張子')

次のようにグラフを作成した後に、plt.savefig()を実行しましょう。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2,2)
y = x**2
plt.plot(x,y)

plt.savefig('sample.png')

下図のように作業フォルダに画像が保存されます。

保存形式や解像度など保存条件を変更する場合は、savefig()の引数で指定することも可能です。

この記事では、plt.savefig()の詳しい設定内容、保存時に役立つ設定について解説していきます。

figureオブジェクトのsavefig()を使うパターン

plt.savefig()の詳細設定を確認する前に、オブジェクト志向でプロットしている場合の画像保存方法についても解説しておきます。

figureオブジェクトを生成している場合は、figuresavefig()メソッドで保存することもできます。

  • figure.savefig('ファイル名.拡張子')

オブジェクト指向のプロットについての詳細は、次の記事を参考にしてください。

≫Matplotlib plt.subplots()の使い方|FigureとAxesを同時生成!
Matplotlibでグラフを描くとき「fig, ax = plt.subplots()って、よく見るけど何してるの?」「plt.subplots()の便利な使い方を知りたい! 」という方のために、plt.subplots()でFigureとAxesを作ると何が便利なのか、plt.subplots()の基本的な使い方、覚えておくと便利なplt.subplots()の引数を図解付きで解説します!plt.subplotsはオブジェクト指向のプロット作成の基本なので使い方をぜひ覚えましょう!
www.yutaka-note.com/entry/matplotlib_subplots
 

オブジェクト指向の場合の画像保存のサンプルコードを確認してみましょう。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2,2)
y = x**2

fig, ax = plt.subplots()
ax.plot(x,y)

fig.savefig('sample.png')
plt.close(fig)

オブジェクト指向でグラフを描画する際は、スクリプト内で描画→保存を繰り返すことも多いです。

保存して不要になったプロットはplt.close(fig)で閉じて、リソースを解放すると良いです。

fig.savefig()の引き数はplt.savefig()と共通なので、以下ではplt.savefig()を例に詳細設定について解説していきます。

savefigメソッドの詳細設定

savefig()では、次のような引数を取ることができます。

設定内容 引数名 設定例
保存名(省略可) fname 保存先のファイル名またはパスを指定
拡張子で保存形式を指定可能
解像度 dpi 解像度を数値で指定
デフォルト:100
余白の削除 bbox_inches bbox_inches='tight'で余白を削除
余白の調整 pad_inches 余白サイズを明示的に指定
例)pad_inches=1
背景の色 facecolor 色名等を指定
例)facecolor='blue'
枠線の色 edgecolor 色名等を指定
例)edgecolor='blue'
背景の透明化 transparent True or False
デフォルト:False

以下で各引数を使用した設定方法について詳しく解説していきます。

ファイル名の指定, fname

保存する画像のファイル名はfnameで指定します。fnameの引数名は省略可能です。

  • plt.savefig(fname='ファイル名') or
  • plt.savefig('ファイル名')

Matplotlibで対応している拡張子を指定すれば、指定した形式で出力してくれます。

fnameの指定内容 出力ファイル
"ファイル名.拡張子" "ファイル名.拡張子"
Matplotlibで対応する拡張子のみ
"ファイル名" "ファイル名.png"
→ 省略するとpngで保存される

対応している拡張子

Matplotlibで対応している基本的な拡張子は以下の通りです。

ファイルの種類 拡張子 形式
PNGファイル .png ラスタ形式
JPGファイル .jpeg, .jpg
TIFFファイル .tiff, .tif
SVGファイル .svg ベクタ形式
PDFファイル .pdf

ラスタ形式とベクタ形式を簡単にまとめると次の様な違いがあります。

比較内容 ラスタ形式 ベクタ形式
概要 ピクセルの集合として画像を表現 点や線などの集合で画像を表現
向き不向き 写真などの高解像度な画像も表示可 写真などの複雑な画像に向かない
拡大時の特徴 拡大すると画像が荒くなる 拡大しても画像が荒くならない

拡大してみると、ラスタ形式は粗くなりますが、ベクタ形式は粗くなりません。

また、ファイル形式によって画像のサイズにも違いが出てきます。

上記の二次曲線のグラフを各形式で出力してみると、次のようなファイルサイズになります。

ファイルの種類 ファイルサイズ, kB
PNGファイル 22
JPGファイル 18
TIFFファイル 1,201
SVGファイル 16
PDFファイル 7

今回の場合は、TIFF形式のサイズが圧倒的に大きく、PDFのサイズが一番小さくなりました。

用途に応じて出力ファイルの形式を設定するようにしましょう。

解像度の設定, dpi

引数dpiで画像の解像度を指定することができます。デフォルトは100です。

  • plt.savefig('sample.png', dpi=300)

解像度を増やすと、画像がより高品質になりますが、ファイルサイズが大きくなります。

サンプルコードで実行例を確認してみましょう。

x = np.linspace(-2,2)
y = x**2

plt.plot(x,y)

plt.savefig('sample.png', dpi=300)

上記の例では、解像度に応じて次のように画像サイズが大きくなりました。

解像度, dpi ファイルサイズ, kB
100 22
300 81
500 147

用途に応じて適切な値を設定しましょう。

また、解像度の設定が反映されるのは、ラスタ形式(jpg, png, tiff)のみです。

ベクタ形式では解像度を指定しても特に何も影響ありません。

余白の削除, bbox_inches

デフォルトでは、グラフの周りに若干の余白ができますが、引数でこの余白を最小限に縮めることができます。

  • bbox_inches="tight"

余白を削除すると、画像がスッキリしてみえます、

サンプルファイルで実行例を確認してみましょう。

x = np.linspace(-2,2)
y = x**2

plt.plot(x,y)

plt.savefig("sample_normal.png")
plt.savefig("sample_tight.png", bbox_inches="tight")

2つの画像を比較してみましょう。

bbox_inchesは、figureの特定の部分を切り出すために使用することもできますが、この使い方はほとんど使用しないと思います。

from matplotlib.transforms import Bbox

x = np.linspace(-2,2)
y = x**2

plt.figure(figsize=(5,5))
plt.plot(x,y)

plt.savefig("part_of_sample.png",  bbox_inches=Bbox([[0, 0], [2.5, 2.5]]))

次のように画像の左下から2.5inchの領域だけが切り出されます。

余白サイズの設定

pad_inches引数で、余白のサイズを調整することができます。

  • pad_inches = 余白の大きさ

pad_inchesで余白を指定する場合は、bbox_inches="tight"と併用する必要があります。

x = np.linspace(-2,2)
y = x**2

plt.plot(x,y)

plt.savefig("sample_tight.png", bbox_inches="tight")
plt.savefig('sample_padding.png',bbox_inches="tight", pad_inches=2)

この例では、グラフの周りに2インチの余白が設定されています。

余白が大きすぎると、グラフが小さく見にくくなってしまいます。

適切な余白の大きさを設定して、グラフを見やすくしましょう。

色を変更する方法

.savefig()の引数設定で、保存時に背景色、枠線の色を変更することができます。

画像の保存時に設定できる色関連の引数は次の通りです。

設定内容 引数名 設定例
背景色 facecolor "blue":背景色を青にする。
背景の透過度 transparent True:背景を透過させる
画像の枠線 edgecolor "red":枠線を赤にする

facecolor単独だとグラフ外に色がつき、transparentと組み合わせると全体に色がつきます。

サンプルコードで挙動を確認してみましょう。

x = np.linspace(-2,2)
y = x**2

plt.plot(x,y)

plt.savefig("sample_facecolor.png", facecolor="lightgray")
plt.savefig("sample_transparent.png", transparent=True)
plt.savefig("sample_transparent_facecolor.png", transparent=True, facecolor="lightgray")

それぞれ下図のように背景色が設定されます。

グラフの外側の枠線の色はedgecolorで指定します。

ただし、デフォルトでは枠線の太さが指定されていないので、枠線の太さも事前に指定しましょう。

  • plt.figure(linewidth=枠線の太さ)
  • plt.savefig("sample.png", edgecolor=色)

サンプルコードで挙動を確認してみましょう。

x = np.linspace(-2,2)
y = x**2

plt.figure(linewidth=5)
plt.plot(x,y)

plt.savefig("sample_edgecolor.png", transparent=True, edgecolor="red")

次のように枠線に色がつきます。

細い枠線だと、一部欠ける場合があるので注意しましょう。

その他の画像保存関連の設定

.savefig()の引数とは異なりますが、画像保存に関連する設定として以下の内容を解説します。

  • 画像サイズの変更
  • 軸の範囲の変更
  • 色の変更
  • フォントの変更

画像サイズの変更

画像のサイズは、figureオブジェクトのfigsizeを指定して変更します。

  • plt.figure(figsize=(width, height)) または
  • fig, axes = plt.subplots(figsize=(width, height))

pltでプロットする場合は前者、オブジェクト指向の場合は後者を使用しましょう。

デフォルトのサイズは、(6.4 inch, 4.8 inch)です。

サンプルコードで挙動を確認してみましょう。

x = np.linspace(-2,2)
y = x**2

plt.figure(figsize=(5,5))
plt.plot(x,y)

plt.savefig("sample_rectangle.png")

次のような5inch×5inchの画像になります。

  • 【参考】plt.figure()を使った設定については次の記事で詳しく解説しています。
≫Matplotlib plt.figure()を使う理由|FigureとAxesの関係を把握しよう
Matplotlibでグラフを描くとき「FigureとかAxesとかMatplotlib独特の単語が多くてよくわからない」、「Figureを作った後、結局どうやってプロットすればいいの?」という方のために、FigureとAxesの関係性を図解!FigureにAxesを追加する方法厳選3パターンを解説します!覚えておきたいFigureの設定・操作(サイズ変更、レイアウト調整など)も画像・サンプルコード付きで解説!
www.yutaka-note.com/entry/matplotlib_figure
 

フォントを変更する方法

Matplotlibでフォントを変更する場合は、主に次の3つの方法があります。

  • fontnameを指定
  • rcParamsを設定
  • matplotlibrcファイルを書き換え

それぞれの方法のメリットデメリットは次の通りです。

設定方法 メリット デメリット
fontname指定 テキストごとに個別設定可能 個別設定に手間がかかる
rcParamsを変更 スクリプト冒頭で一括設定可能 毎回設定するのがめんどう
fontnameほどではない)
matplotlibrcを書き換え 一度設定したら半永久的にOK 設定ファイルの書き換えのため、
コードでは変更点がわからない

具体的な方法は以下の記事で解説しています。

≫Matplotlib 日本語の表示方法|簡単にいろんな日本語フォントを使う方法
pythonのプロット作成ライブラリといえば、Matplotlibが有名ですが、デフォルト設定では日本語は表示できません。そこで、この記事では簡単な方法から様々な状況に対応できる方法まで、詳しく手順を解説していきます。①「Matplotlibで日本語を表示する方法」、②「すぐに使用できる日本語フォントのチェック方法」、③「任意の日本語フォントを追加して使用する方法」。これで日本語化で困ることもなくなると思います!
www.yutaka-note.com/entry/matplotlib_japanese
 

色を変更する方法

色の設定は個別のグラフの色の設定、カラーサイクルの設定があります。

個別の設定はcolor="色名"などで指定することができます。次の記事で詳しく解説しています。

≫Matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 

カラーサイクルは複数のグラフを描いた際に自動で設定される色のことです。次の記事で詳しく解説しています。

≫Matplotlib 日本語の表示方法|簡単にいろんな日本語フォントを使う方法
pythonのプロット作成ライブラリといえば、Matplotlibが有名ですが、デフォルト設定では日本語は表示できません。そこで、この記事では簡単な方法から様々な状況に対応できる方法まで、詳しく手順を解説していきます。①「Matplotlibで日本語を表示する方法」、②「すぐに使用できる日本語フォントのチェック方法」、③「任意の日本語フォントを追加して使用する方法」。これで日本語化で困ることもなくなると思います!
www.yutaka-note.com/entry/matplotlib_japanese
 

軸の範囲を設定する方法

軸の範囲はplt.xlim(), plt.ylim()で設定が可能です。

例えば、次のように設定します。

x = np.linspace(-10,10)
y = x**2

plt.xlim(-5,5)
plt.xlim(-20,20)
plt.plot(x,y)

plt.savefig("sample_xlim.png")

下図のように表示範囲が制限されます。

軸周りの詳しい設定については次の記事を参考にしてください。

≫Matplotlib 軸周り完璧マスターガイド | 軸・軸目盛・目盛り線の設定
Matplotlibで大変なのが軸周りの設定!グラフの「この要素」を変更するには、「どのメソッド」を使えばいいのかわからない…。という方のために、Matplotlibの軸・目盛り・目盛り線の設定について総まとめしました!これで軸周りの設定がだいぶ楽になります。軸周り完ぺきマスターガイド!
www.yutaka-note.com/entry/matplotlib_axis
 

オススメ|matplotlibとデータ分析の勉強方法

今回は、Matplotlibの日本語化方法について、簡単な方法から様々な状況に対応できる方法まで解説しました。

Matplotlibは奥の深いモジュールですが、なかなかわかりにくい部分もあります…。

そこで、グラフの作成方法、種類変更、凡例、タイトルの設定など網羅的にわかりやすく整理した記事を作りました。ぜひ参考にしてみてください。

≫【初心者向け】Matplotlibの特徴と使い方をわかりやすく解説!
脱初心者のためのMatplotlibマスターガイドです。そもそもどういう流れでプロットするのか?どんな種類のグラフが描けるのか?日本語設定は?タイトルや軸の設定は?オブジェクト指向って何?そんな疑問を解決します!この記事で、脱Matplotlib初心者を目指そう!
www.yutaka-note.com/entry/matplotlib_guid
 

また、データ分析初心者の方にはこちらの記事もおススメです。

私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。

何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。

≫独学でデータ分析を勉強するオススメ学習本
独学でのpythonデータ分析勉強に役立ったおススメ書籍を紹介していきます。業務でそれなりにデータ分析を行えるまで、いろいろな試行錯誤をしてきましたが、もし自分が今ゼロから勉強する立場ならどうするのがいいのか考えてみました。以下では、入門書、個別モジュール用、実践用の3つの視点でおススメ本を紹介していきます。
www.yutaka-note.com/entry/data_analysis