本当に久しぶりのPlots.jlのGRバックエンドのアトリビュートを紹介するだけのこのシリーズ。
今回はdpiとsizeです。
sizeはともかくこのdpiはほぼpngファイルしか関係のないアトリビュートです。
sizeアトリビュート
sizeアトリビュートはグラフ全体の大きさを指定するものですが,
色々試した感じでは結構くせものです。
size=(600, 400)のように(横幅, 縦幅)で指定するのですが,この単位はpxです。
でさらにこのpxの単位は1/100 inch相当の0.254mmの値になっています。
なので単位はpx(100dpi相当)ということになります。
以上のことからも分かる通り,Plots.jl自体の動作は100 dpi固定である,ということです。
この値はPlots.jlのバージョン1系ではPlots.pxで長さが分かります。(バージョン2系はPlotsBase.px)
プロットオブジェクトの実サイズがどのように想定されているかは,
plt.attr[:size] .* Plots.pxとかで分かります。
バージョン2の対応も含めると,次のような感じです。
""" get_plot_size(plt) `plt`のサイズを返す。 """ function get_plot_size(plt) pltmod = isdefined(Plots, :PlotsBase) ? PlotsBase : Plots plt.attr[:size] .* pltmod.px end
使用例は次のような感じ。
julia> get_plot_size(plt_2) (152.4mm, 101.6mm)
dpiアトリビュート
前述の通りPlots.jlのGRバックエンドについては,基本的に100 dpi固定で処理されます。
つまり,画面上は全て100dpiだと思って処理されます。
plot関数内でdpiに値を設定すると,pngファイルに出力する時に
100 dpiとしての:sizeアトリビュートがpxとしてのinchの
サイズとして設定した dpiのピクセル数の画素数で出力します。
って言っている本人がよく分からなくなってきました。
なので説明用の図を次に用意します。

上側がPlots.jl内部の動作で,下側がpngファイルのイメージです。
pngファイルでは sizeのタプル × (dpiの指定値/100)ピクセル
のサイズとなることが分かります。
dpi=300の場合,sizeで設定した時の3倍のピクセル数になることが分かります。
図の状況を言葉で表すと,
- プロットオブジェクトは
dpi=300だけど内部では100dpi固定で動作 - プロットオブジェクトは
size=(600, 400)だけど出力サイズ(ピクセル)は(1800, 1200)
とよく分からない状況になります。
また,この出力したpngしたファイルにはdpiの設定がされていません。
なので,利用するアプリケーション側でサイズを指定する必要があります。
例えばpngの出力ファイルをLaTeXで利用する場合のような感じで指定します。
... \includegratphics[width=152.4mm]{output.png} % 600 * 0.254mm ...
これはpdf出力のファイルを利用する場合でも同じです。 想定されるフォントサイズ(pt単位の指定)で表示する時は上記の設定は必須となります。
この辺りの関係が分かれば,LaTeXだけでなくWORD等でもGRバックエンドのpng出力を うまく扱うことができるでしょう。
""" get_png_px(plt) `plt`を`png`形式で出力した時のピクセルサイズを返す。 ただし,本来整数に丸めるべき処理もせず 小数点のままの参考値であることに注意。 """ function get_png_px(plt) pltmod = isdefined(Plots, :PlotsBase) ? PlotsBase : Plots plt.attr[:size] .* (plt.attr[:dpi] / pltmod.DPI) end
julia> get_png_px(plt_2) (1800.0, 1200.0)