在 R 中绘制图像时输出大小错误

Wrong output size when plotting over an image in R

我的目标是读取 PNG 或 JPEG 格式的图像文件,并在所述图像上绘制各种数据并将其保存到磁盘。

我还希望图像占据生成的绘图中的所有可用 space,没有轴或标签或任何东西。我有点担心这可能与我的问题有关。

代码示例

下面是我当前的代码,目前只尝试输出与您输入的图像相同的图像。稍后我计划绘制与图像坐标对应的数据点。我使用了此处找到的一些示例代码来移除轴并能够在绘图的背景中显示图像。

library(jpeg)
library(grid)

img <- readJPEG(system.file("img", "Rlogo.jpg", package="jpeg"),native=TRUE)
jpeg(filename = "Rlogo-2.jpg", width=100,height=76, quality = 100,res=299)

op<-par(mar=rep(0,4))
plot(0:100,type="n", axes="FALSE",ann="FALSE")
lim <- par()
rasterImage(img, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])

dev.off()

示例输出

这是我上面的代码与原始图像比较的示例输出:

左图为原图,右图为修改后的图。如您所见,我读取和绘制的图像似乎比原始图像小,当保存到原始尺寸时,它看起来很模糊。

我已经为这个问题苦苦思索了几个小时,但我似乎一无所获。这是我第一次尝试在图像上绘制数据,我知道我对 R 如何表示图像缺乏了解,之前我主要使用基本图形来做相对简单的绘图。

我目前正在考虑在 Python 中执行此操作,但我担心在实际绘制数据时会回来咬我一口。

我 运行 R 版本 3.1.0 x86_64 运行宁 Windows 7.

总结一下,既然你已经找到了罪魁祸首,这里有两个问题:

首先,模糊似乎是由 Windows 上的 jpeg 设备引起的。 Ubuntu Linux 上没有这样的问题,如果你使用 Cairo 设备,它就会消失,正如你已经发现的那样。 Cairo 设备也非常适合 pdf:s,因为它们嵌入了所有字体等,使图形在各个平台上看起来都一样。

其次,R 默认为 x 和 y 轴添加 4% 的额外边距,以防止绘图区域边缘附近的图形被切掉。可以通过设置xaxs="i"yaxs="i".

来修正
par(mfrow=1:2)
plot(1:5, 1:5) # Left
plot(1:5, 1:5, xaxs="i", yaxs="i") # Right

在你的情况下,差异很细微,但仍然会导致一切都稍微错位。