一个用于按比例缩放ggplot2、lattice或基础R图形的函数。

11

在R中,我总是觉得很烦恼的是基本的R、lattice和ggplot2图形都使用绝对点大小来表示文本和图形符号的大小。

这意味着,如果您增加了绘图窗口的大小以获取填满页面的图形,则所有文本和图形符号的大小都会相应地增加,这可能会导致不必要的混乱。

windows(width=5,height=5);qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7))

windows(width=10,height=10);qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7))

相对于其他元素,文本和绘图符号的比例缩放也会改变。Base R和Lattice图案也是如此。

在编写一些图形导出函数的背景下,我想知道是否可能编写一个函数,可以接收当前图形设备的输出(可以使用recordPlot()访问),并按任意百分比缩放所有绘图符号、文本以及线条宽度,从而允许图形以任何尺寸进行导出,同时仍然保持相同的外观?也就是说,一个函数可以将整个图形按比例放大或缩小,同时保持相同的外观吗?

附注:在高DPI 4K屏幕上缩放RStudio绘图窗口并使其可读性强也需要相同的功能(现在RStudio使用像素加倍技术,但这使得绘图窗口看起来非常模糊,并且与Windows中的清晰类型结合使用时会引起颜色分离问题)。

2个回答

5

由于某些原因,点大小被编码为字体大小,因此似乎不容易将其转换为可以自动缩放的单位。如果您知道要应用的缩放比例,则以下内容可能有所帮助。

library(ggplot2)
p <- qplot(Sepal.Length, Petal.Length, data = iris, 
           geom=c("point","line"),
           color = Species, size = Petal.Width, alpha = I(0.7))

library(gtable)
library(grid)

g <- ggplotGrob(p)
pts <- g$grobs[[4]][["children"]][[2]] # geom_point layer
lns <- g$grobs[[4]][["children"]][[3]] # geom_line layer
g$grobs[[4]][["children"]][[2]] <- editGrob(pts, size=1.2*pts$size)
gp <- modifyList(lns$gp, list(lwd=1.2*lns$gp$lwd))
g$grobs[[4]][["children"]][[3]] <- editGrob(lns, gp=gp)

grid.newpage()
grid.draw(g)

enter image description here


谢谢您的回复 - 当我尝试运行代码时,g和p看起来是一样的。您有什么想法吗?另外,我正在寻找一种通用的方法来按某个因子缩放所有图形元素,包括线宽、绘图符号和字体大小。这样,如果您将绘图窗口缩放2倍,您可以按相同的因子缩放所有图形元素... 这最好能够适用于ggplot2以及lattice或基本R图形... - Tom Wenseleers
好的,那我会尝试使用ggplot2的dev版本。但我想这只是部分解决方案,因为我还需要找到适用于lattice图形的方法。作为另一种解决方案,有没有可能改变图形窗口的ppi(我认为现在默认是72)?比如使用recordPlot()捕获图形,改变ppi以更改缩放比例,然后重新绘制? - Tom Wenseleers
我不知道你的问题的一般解决方案。网格有一些根据父视口进行缩放的设置,比如cex,但不幸的是它们并不总是被一致地使用。 - baptiste
好的,我明白了 - 无论如何感谢您的帮助和建议!顺便问一下 - 线宽是否也可以使用类似上述方法按比例缩放? - Tom Wenseleers
谢谢 - 看起来对于那些特定层中的绘图符号和线宽度的大小是有效的,但是对于背景中的网格线、刻度线、图例中的绘图符号大小以及字体或其他可能存在的层次结构都不适用。也许另一种方法是查找g的任何子列表元素,并按一定因子缩放所有命名为size、lwd或fontsize的子列表? - Tom Wenseleers
显示剩余4条评论

4

这似乎更接近您的最终目标。

library(ggplot2)
p <- qplot(Sepal.Length, Petal.Length, data = iris, 
           geom=c("point","line"),
           color = Species, size = Petal.Width, alpha = I(0.7))
library(grid)
print(p, vp=viewport(gp=gpar(cex=2, lex=2)))

谢谢您提供的解决方案,+1。但可能仍然无法完全符合所需结果,例如windows(height=5,width=5); p和windows(height=10,width=10); print(p, vp=viewport(gp=gpar(cex=2, lex=2)))会产生非常不同的结果,例如图形符号的大小和图例中的间距不会随比例缩放...相当棘手...似乎这种情况真的需要在grDevices的某个低级别上得到支持...也许可以通过一些dpi设置来告诉屏幕的dpi是多少... - Tom Wenseleers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接