【问题标题】:R: function to scale ggplot2, lattice or base R graph proportionallyR:按比例缩放ggplot2,晶格或基本R图的功能
【发布时间】:2015-10-01 13:57:24
【问题描述】:

在 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))

文本和绘图符号的相对比例相对于其余部分发生变化。 这同样适用于基础 R 和格点图。

在我正在编写的一些图形导出函数的上下文中,我想知道是否可以编写一个函数来获取当前图形设备的输出(可以使用recordPlot() 访问),并缩放所有以任意百分比绘制符号和文本以及线宽,从而允许以任何大小导出图形,同时仍保持相同的外观? IE。在保持外观不变的同时按比例缩放整个图形到更大或更小的尺寸的函数?

PSthe same would be required to be able to scale the RStudio plot window on high DPI 4K screens and still make it legible (right now RStudio uses pixel doubling but this makes the plot window look really fuzzy, and also causes problems in combination with Cleartype on Windows, causing colour fringing).

【问题讨论】:

    标签: r graphics ggplot2 rstudio


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 感谢这个 - 当我尝试代码 g 和 p 看起来一样。有什么想法吗?此外,我正在寻找的是一种通用方法来缩放所有图形元素,包括线宽、绘图符号和字体大小。所以如果你例如将绘图窗口缩放 2 倍,您可以将所有图形元素缩放相同的因子...理想情况下,这必须适用于 ggplot2 以及晶格或基本 R 图...
    • 我使用的是ggplot2的开发版,很可能早期版本使用的是size而不是fontsize(我认为这是最近的举动)
    • 哈好吧,然后我会尝试使用 ggplot2 的开发版本 - 尽管我猜这仍然只是部分 ggplot2 解决方案,我正在寻找一个也可以工作的解决方案,例如与格子图。作为替代解决方案,是否不可能更改图形窗口的 ppi(我认为现在被认为是 72)?例如。用recordPlot()抓图,改变ppi改变缩放比例,然后重绘?
    • 分辨率将取决于设备设置,不受绘图控制
    • 我不知道您的问题的一般解决方案。 grid 有一些设置可以根据父视口进行缩放,例如 cex,但不幸的是,它们的使用并不总是一致的。
    【解决方案2】:

    这似乎更接近你的最终目标

    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 - 虽然可能还不够接近真正可用的预期结果 - 例如窗户(高度=5,宽度=5); p 和窗口(高度=10,宽度=10); print(p, vp=viewport(gp=gpar(cex=2, lex=2))) 导致完全不同的结果,例如图例中的绘图符号和间距的大小不会随着缩放......非常棘手......我猜这似乎是grDevices中真正必须在某些低级别支持的东西......也许有一些dpi设置这将告诉您的屏幕是多少 dpi...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多