我用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还是有点问题?
非常感谢您的帮助,
米卡
我在这个问题上遇到的所有问题都可以追溯到png()
或pdf()
或任何输出调用中的高度和宽度调用。播放高度和宽度,以便最好地确定它的外观。
如果你想知道导出时使用x11(height= width= )
会是什么样子,请注意这里的单位是“in”,所以你需要在输出函数中模仿它。