我使用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>
所以一切似乎都有效。现在,如果我在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导出如下所示:
差异似乎很小,但这没有帮助。那么,有没有一种方法可以像gtable对象pta
中描述的那样完全保存图像?这是dpi还是有点问题?
非常感谢你的帮助,
米卡
答案 0 :(得分:1)
我遇到的这个确切问题的所有内容都可以追溯到png()
或pdf()
或任何输出调用中的高度和宽度调用。使用高度和宽度进行游戏,以便最好地确定它的外观。
如果您想知道导出使用x11(height= width= )
时的效果,请注意此处的单位为“in”,因此您需要在输出函数中模仿它。