如何在R中保存图像与“存储”完全一致?

问题描述 投票:3回答:1

我用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()绘制的线:

所以一切似乎都有效。现在,如果我在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) oder grid.draw(pta)),实际比例与R环境中正确的计算比例不同。一定数量的plotmargins似乎被切断了,显然还有额外的缩放。例如,png导出如下所示:

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

非常感谢您的帮助,

米卡

r ggplot2 plot r-grid
1个回答
1
投票

我在这个问题上遇到的所有问题都可以追溯到png()pdf()或任何输出调用中的高度和宽度调用。播放高度和宽度,以便最好地确定它的外观。

如果你想知道导出时使用x11(height= width= )会是什么样子,请注意这里的单位是“in”,所以你需要在输出函数中模仿它。

© www.soinside.com 2019 - 2024. All rights reserved.