我正在尝试做表面上很简单的事情:创建一个具有指定的逐像素尺寸(3600x3600),没有任何边距或轴标签的热图(即2D直方图)图像。

我可以使用hist2d函数成功创建数据矩阵。但是,当我使用以下代码进行绘图时,我得到的图像文件的确为3600x3600,但实际上包括x轴和y轴刻度线以及边缘上的一些空白。令人烦恼的是,该空白不是各向同性的-在不同的侧面上有不同的数量-所以我不能只是将初始图像放大一点,将其读取到PhotoShop中,然后将其裁剪为3600x3600,以便仅包含绘图面积像素(虽然会很费力)。

par(mar=c(0,0,0,0)) # this *should* eliminate all margins, leaving only the plot area... right?
png("filename.png", w=3600, h=3600)
image(my_matrix, col=heat.colors(16))
dev.off()


奇怪的是,如果我只是在Quartz窗口中绘制图像(我在MacBook Pro,FYI)上,这些标签和空格就不会出现:

image(my_matrix, col=heat.colors(16)) # opens new window that looks perfect!


这可以很好地工作,但是(我知道)无法(以引脚为单位)以像素为单位指定此图的大小,而仅以英寸为单位。因此,我不能只保存此绘图窗口以获得我想要的确切PNG。

我已经花了几天时间,却一无所获。有什么帮助吗? par(mar)参数如何与某些绘图“设备”或其他东西交互是否有些怪异?...

最佳答案

如果我在激活设备后放par调用,它将起作用(连同设置axes = FALSE来摆脱轴:

png("~/Desktop/so/heatmap.png",w=400,h=400)
par(mar = c(0,0,0,0))
require(grDevices) # for colours
x <- y <- seq(-4*pi, 4*pi, len=27)
r <- sqrt(outer(x^2, y^2, "+"))
image(z = z <- cos(r^2)*exp(-r/6), col=gray((0:32)/32),axes = FALSE)
dev.off()




显然,在此示例中,我使用了较小的图像尺寸。此示例代码来自?image

10-06 10:33