如何在R中保存图像完全按照存储'?

时间:2015-04-04 15:49:32

标签: r ggplot2 plot r-grid

我使用ggplot2和多个方面生成了一个随机示例图。我对各个面板的确切位置感兴趣,并希望导出这些面板的相对起点和终点坐标以及绘图的图片(主要用于通过javascript环境中的鼠标悬停事件进行点识别)。

要获取相关坐标所需的信息,请使用网格包。假设p是存储我的情节的变量(在p <- ggplot(...)之后)。

使用

 pb <- ggplot_build(p)
 pta <- ggplot_gtable(pb)
 heights <- pta$heights

类似于宽度,我得到了那些信息。 例如,在这种情况下,我得到了heigths

[1] 1lines               0cm+0lines           1null               
[4] 0.25lines            1null                0.25lines           
[7] 1null                0.532222222222222cm  1grobheight+0.5lines
[10] 0.5lines  

其中单位为null的条目代表面板。为了能够比较这些我必须将它们转换成相同的单位。 null我无法转换,但其余的转换。使用它的视口是1npc(npc也是一个单位)的宽度和长度我可以解决一个方程式,它允许我创建下面的图像(来自RStudio图窗口的屏幕截图),用grid.lines()绘制的线: / p>

enter image description here

所以一切似乎都有效。现在,如果我在RStudio中重新缩放Plot窗口,则会在错误的位置绘制线条。原因是像grobheight这样的单位依赖于当前视口。因此,如果我想保存图像(例如600 x 600像素),我必须这样做

png(fn, width = 600, height = 600)
pushViewport(viewport(width=0.5, height=0.5, xscale=c(0, 600), yscale=c(0, 600)))
print(p)
... #draw the lines
dev.off()

但是。 尽管如此,无论我如何保存图片,请说ggsave()png()(后者要么print(p)或者grid.draw(pta)),实际比例与计算出的比例不同在R环境中正确。 一定数量的plotmargins似乎被切断了,显然还有额外的缩放。 例如,png导出如下所示:

enter image description here

差异似乎很小,但这没有帮助。那么,有没有一种方法可以像gtable对象pta中描述的那样完全保存图像?这是dpi还是有点问题?

非常感谢你的帮助,

米卡

1 个答案:

答案 0 :(得分:1)

我遇到的这个确切问题的所有内容都可以追溯到png()pdf()或任何输出调用中的高度和宽度调用。使用高度和宽度进行游戏,以便最好地确定它的外观。

如果您想知道导出使用x11(height= width= )时的效果,请注意此处的单位为“in”,因此您需要在输出函数中模仿它。