LoginSignup
0
0

Rで描いたグラフのスクリーンショットをquartz.save()で保存したPNG画像と比べたらグラフの縦が僅かに短い

Last updated at Posted at 2023-06-26

前回の記事の続きです。

Rのpng()関数とquartz.save()関数を使ってファイルに書き出したグラフのPNG画像。これらをQuartzウインドウのスクリーンショット画像に重ねてみたところ、あることに気づきました。

スクリーンショットのグラフは、他の2つの画像のそれに比べて縦方向が少し縮んでいるように見えます!

以下、現象の説明です。

実行環境1
R 4.3.1, macOS 12.6.5, iMac (Retina 5K)

ズレの検証がしやすいように、この記事では正方形のボックスと45度の直線をプロットしたグラフを使います(図1)

図1
quartz.png
上のグラフを描くRのスニペットはこれです。

例1
par(pty="s")
plot(0:100, 0:100, xaxs="i", yaxs="i", type="l", asp=1)

引数の意味は次のとおり。

  • par()関数の引数pty="s"でプロット領域を正方形に指定し、
  • XY軸のアスペクト比が1:1になるようにplot()関数の引数aspに1を指定します。
  • さらに、(0,0)と(100,100)がboxの頂点にくるようにplot()グラフィカルパラメーターの引数xaxs="i"yaxs="i"を指定します。

同様に次の例2と例3は、それぞれpng()quartz.save()を使ってファイルに書き出すスニペットです。

例2
png("graph.png", width=1520, height=1520, res=218, type="quartz")
par(pty="s")
plot(0:100, 0:100, xaxs="i", yaxs="i", type="l", asp=1)
dev.off()
例3
par(bg="white", pty="s")
plot(0:100, 0:100, xaxs="i", yaxs="i", type="l", asp=1)
quartz.save("quartz.png", dpi=218)

ズレの検証手順

冒頭のツイート添付の動画に使われているPhotoshopの画像についての説明です。

最初に、スクリーンショットに撮った例1の出力画像をPhotoshopに読み込みます(レイヤー1)、その上に例2と例3の出力画像を配置します(レイヤー2と3)。その際、グラフのボックスの幅と上辺の位置がレイヤー1(screenshot)のものと一致するように画像の位置を調整します1

Photoshopで画像のリンクを配置する際、筆者の環境では 環境設定 > 一般 > 画像をサイズ変更して配置 がON(デフォルト)になっています。背景レイヤー(screenshot)の横幅(1520px)より広い画像(1525px)を配置した時、Photoshopがアスペクト比を維持したまま画像の幅を1520pxに調整してくれるので、手作業で画像を拡大・縮小する操作は行なっていません。

次にPhotoshopで正方形のシェイプを作り(マゼンタ色の線色)、レイヤー4に追加します。シェイプの上辺の位置をグラフのボックスに合わせ、縦横比を固定でドラッグしながらシェイプを拡大し、幅をボックスと一致させます。

結果、レイヤー2と3のPNG画像については、期待どおりレイヤー4「正方形」のシェイプとグラフのボックスが一致しました(図2)。

図2
clip03.png
ところが、レイヤー1の画像は正方形の下辺の位置がマゼンタ色の線より上にズレてしまってます(図3)。

図3
clip01.png
高さが正方形の一辺より短くなっているため、45度になるはずの対角線もズレてしまっているのがわかります(図4)。図で、グレーの線色が薄い方がレイヤー3(quartz.save)です。実際、Photoshopのものさしツールで対角線の角度を測るとレイヤー2と3の画像では45度になるのに対して、レイヤー1の画像では44.7度でした。

図4
diagonal.png
この現象、最初、筆者が使っているモニターの画面が歪んでいるのかと疑いましたが、CSSで正方形を作ってブラウザーに表示したものをスクリーンショットで撮り、同様の手順でPhotoshopで確認したところ正しく正方形になっていましたから、RのQuartzウインドウの問題ではないかと思います。

キャンバスのサイズが正方形ではない?

グラフを描かずに別の方法で検証してみます。
筆者の環境では、RのQuartzウインドウのキャンバスがそもそもデフォルトで正方形になっていないことがわかりました。

Rのdev.size()関数を呼んで、ブランクのQuartzウインドウを表示させてみます。

> dev.size("in")
[1] 7 7
> 

dev.size()はサイズ"7 インチ"を返してきますが、実際に表示されたQuartzウインドウのスクリーンショットを撮り、Photoshopに読み込んでキャンバス部分を切り抜くと縦のピクセル数が幅よりも短いのがわかります。

まず、自動選択ツールでキャンバスの領域を選択します(図5)。

図5
blank_select.png
次にその選択範囲で画像を切り抜きます(図6)
図6
blank_crop.png
切り取った結果の画像の寸法を右上のプロパティで確認すると、W 1520 px, H 1505 pxになっています。

やはり幅に比べて縦が15 px(デバイスピクセル)短い!画面上の寸法に換算2すると幅760px, 高さ752.5pxだったというわけです。

縦が短くなる現象は使用するモニターにも依存するのでしょうか。原因は分かりませんでした。

  1. 上のツイートの動画で使用したRのバージョンは4.3.0でしたが、R4.3.1でも現象は再現しました 2

  2. 使用したモニターのデバイスピクセル比は2

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0