matplotlibのdpiとfigsizeの正確な意味を調べてみた

以前、「matplotlibはdpiの数値を大きくすると画像の解像度が上がる」、みたいな非常に雑な理解で記事を書いたのですが、改めて仕様を確認したのでそのメモです。
参考: matplotlibのグラフを高解像度で保存する
前提として、「dpi」は「dots per inch」の略で1インチあたりのドット数を意味します。
正直、画面に表示される画像のサイズというのは、PCのディスプレイサイズに大きく依存するので、1インチを定義することなんてできないだろうと思って流していたのですが、
実は、 figsizeで指定する数値の単位がインチだったようです。

参考: matplotlib.figure.Figure

figsize(float, float), default: rcParams[“figure.figsize”] (default: [6.4, 4.8])
Width, height in inches.

したがって、 figsize で指定した(横幅, 縦幅) と dpi を掛け合わせると、
生成される図のピクセル数が (横幅*dpi) × (縦幅*dpi) と求まるということのようです。

デフォルトの設定(rcParamsでfigsizeとdpiは確認できる)で、figureを生成して確認してみましょう。


import matplotlib.pyplot as plt

print(plt.rcParams["figure.figsize"])
# [6.0, 4.0]
print(plt.rcParams["figure.dpi"])
# 72.0
fig = plt.figure()
# <Figure size 432x288 with 0 Axes>

ドキュメントによると figsizeのデフォルトは、[6.4, 4.8]、dpiのデフォルトは100のはずなのですが、なぜか僕の環境はそれぞれ、
[6.0, 4.0]と 72になってます。これの原因は不明ですが話の本題とズレるので置いておきます。

生成された図のサイズは、横幅が 6*72=432ピクセル、縦幅が4*72=288ピクセルと、理論通りになりました。

例えば、(滅多にそんな要件はないでしょうが)フルHDサイズのグラフ(1920×1080)が作りたかったら、
figsizeを(16, 9)、dpiを120で作成すれば良いことになります。


fig = plt.figure(figsize=(16, 9), dpi=120)
# <Figure size 1920x1080 with 0 Axes>

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です