1. ホーム
  2. matplotlib

[解決済み] dpiと図形の大きさの関係

2022-03-07 16:12:42

質問

matplotlibを使用して図を作成しましたが、プロット軸と描画された線がズームアウトしてしまうことに気づきました。

これを読むと 以前の議論スレッド 図形の大きさを設定する方法について説明しています。

fig, ax = plt.subplots()

fig.set_size_inches(3, 1.5)

plt.savefig(file.jpeg, edgecolor='black', dpi=400, facecolor='black', transparent=True)

上記のコード(簡潔にするため、他の設定は削除しています)では、結果として 1200 X 600 希望する寸法(解像度も言うべきか)と希望するファイルサイズ。

投影された画像は通常とは異なる方法でスケールアウトされ、例えば注釈は拡大されます。軸のラベルの大きさは設定できるのですが、下と右の背骨が大きく、プロットされた線も大きいので、図がスケールに対して比例していないように見えます。

したがって、問題は、どのような構成がうまくいかないのか、ということです。

解決方法は?

図形の大きさ ( figsize ) は、図のサイズをインチで指定します。これにより、軸(および他の要素)が図内に持つスペースの量が示されます。デフォルトの図の大きさは (6.4, 4.8) matplotlib 2 ではインチです。 図サイズを大きくすると、より長いテキスト、より多くの軸、またはより多くの目盛り記号を表示することができます。

ドット/インチ(dpi) は、図が何ピクセルで構成されるかを決定します。matplotlib のデフォルトの dpi は 100 です。の図形は figsize=(w,h) は以下のようになります。

px, py = w*dpi, h*dpi  # pixels
# e.g.
# 6.4 inches * 100 dpi = 640 pixels

そのため、例えばピクセルサイズの図形を得るためには (1200,600) 図形のサイズと dpi の組み合わせは、例えば次のようになります。

figsize=(15,7.5), dpi= 80
figsize=(12,6)  , dpi=100
figsize=( 8,4)  , dpi=150
figsize=( 6,3)  , dpi=200
etc.

さて、何が違うのでしょうか?これは、図の中の要素の大きさで決まります。ライン、マーカー、テキストなど、ほとんどの要素はポイント単位で大きさが決まっています。
Matplotlibの図形は 1インチあたりのポイント数(ppi) の72。太さ1ポイントの線は、幅1./72.インチになります。フォントサイズ12ポイントのテキストは、12./72.インチの高さになります。

もちろん、図のサイズをインチで変えてもポイントは変わりませんので、インチで大きくしても要素の大きさは変わりません。 つまり、図形の大きさを変えるということは、一枚の紙を違う大きさにするようなものなのです。もちろん、同じペンで引いた線の幅が変わるわけではありません。

一方、dpiを変えると、それらの要素はスケーリングされます。72dpiでは、1ポイントの大きさの線は1ピクセルの強さです。144dpiでは、この線は2ピクセルの強さになります。 そのため、dpiを大きくすると、虫眼鏡のような働きをします。すべての要素は、レンズの倍率によって拡大縮小されます。

図のサイズが一定の場合と、dpiを変化させた場合の比較は、下の左の画像に示されています。右側は、dpiを一定にし、図形の大きさを変化させたものです。各列の図形のピクセルサイズは同じです。

再現するためのコードです。

import matplotlib.pyplot as plt
%matplotlib inline

def plot(fs,dpi):
    fig, ax=plt.subplots(figsize=fs, dpi=dpi)
    ax.set_title("Figsize: {}, dpi: {}".format(fs,dpi))
    ax.plot([2,4,1,5], label="Label")
    ax.legend()

figsize=(2,2)
for i in range(1,4):
    plot(figsize, i*72)

dpi=72
for i in [2,4,6]:
    plot((i,i), dpi)