web-dev-qa-db-ja.com

dpiとFigureサイズの関係

Matplotlibを使用してFigureを作成しましたが、プロット軸を認識し、描画された線がズームアウトされます。 enter image description here

これを読んで 以前のディスカッションスレッド で、フィギュアサイズの設定方法を説明します。

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の望ましいサイズ(解像度も言うべきですか?)および望ましいファイルサイズのイメージファイルが得られます。

投影された画像は通常とは異なる方法で縮小され、たとえば注釈が拡大されます。軸上のラベルのサイズを設定できますが、下と右のスパインが大きく、プロットされた線も大きいため、図はスケールに対して比例して見えません。

したがって、質問は、どの構成が間違っているのでしょうか?

27
qboomerang

フィギュアサイズfigsize)は、フィギュアのサイズをインチ単位で決定します。これにより、Axes(およびその他の要素)がFigure内に持つスペースの量が与えられます。デフォルトの図のサイズは、matplotlib 2で(6.4, 4.8)インチです。図のサイズを大きくすると、長いテキスト、より多くの軸、またはより多くの目盛りラベルを表示できます。

インチあたりのドット数(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.

さて、違いは何ですか?これは、Figure内の要素のサイズによって決まります。線、マーカー、テキストなどのほとんどの要素には、ポイント単位でサイズが指定されています。
Matplotlibの数字は、72インチあたりのポイント(ppi)を使用します。太さ1ポイントの線は1./72になります。インチ幅。フォントサイズが12ポイントのテキストは、12/72になります。インチ高。

もちろん、図のサイズをインチ単位で変更しても、ポイントは変更されません。そのため、インチ単位の大きな図でも要素のサイズは変わりません。 したがって、フィギュアのサイズを変更することは、異なるサイズの紙を撮るようなものです。そうすることで、もちろん同じペンで描かれた線の幅は変わりません。

一方、dpiを変更すると、これらの要素がスケーリングされます。 72 dpiでは、1ポイントサイズの線は1ピクセルの強さです。 144 dpiの場合、この線の強度は2ピクセルです。 したがって、より大きいdpiは虫眼鏡のように機能します。すべての要素は、レンズの倍率によってスケーリングされます。

一定の図サイズとさまざまなdpiの比較は、左の図に示されています。右側には、一定のdpiとさまざまなFigureサイズが表示されます。各行の図のピクセルサイズは同じです。

enter image description here

再現するコード:

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)