[解決済み] dpiと図形の大きさの関係
質問
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)
関連
-
[解決済み] matplotlib で swarm プロットを作成する方法
-
[解決済み] pad_inches=0 と bbox_inches="tight" は、宣言された figsize よりも小さいプロットを作成します。
-
matplotlib のエラーです。TypeError: -でサポートされていないオペランドタイプ: 'str' および 'str'
-
Pythonで保存した画像が不完全です
-
[解決済み] サブプロットで図の大きさを変えるには?
-
[解決済み】Matplotlibで図のタイトルと軸ラベルのフォントサイズを設定するには?
-
[解決済み] matplotlib のプロットでフォントサイズを変更する方法
-
[解決済み】Matplotlib の異なるサイズのサブプロット
-
[解決済み】pyplot 散布図 マーカーの大きさ
-
[解決済み] 1つの図に複数の画像を正しく表示するには?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
TclError: 表示名がない、$DISPLAY環境変数の解決策もない。
-
[解決済み] matplot の各極軸に xv ラインを追加する方法
-
matplotlib のエラーです。TypeError: -でサポートされていないオペランドタイプ: 'str' および 'str'
-
python matplotlib カスタムカラーバー colorbar - と matplotlib の組み込みカラーバー
-
Pythonで保存した画像が不完全です
-
[解決済み] matplotlibの図の凡例を削除する
-
[解決済み】seaborn factorplotのラベルテキストを回転させる。
-
[解決済み] ipythonで表示せずにpylab.savefigを呼び出す。
-
[解決済み] Matplotlib - サブプロット脇のグローバルな凡例とタイトル
-
[解決済み] ipython notebook で matplotlib のプロットに任意の直線を追加する