【问题标题】:How can I create a list of plots to be rendered with ggplot?如何创建要使用 ggplot 渲染的绘图列表?
【发布时间】:2021-08-03 08:33:39
【问题描述】:

我正在尝试构建一个 ggplot 图形列表,稍后将绘制该列表。到目前为止,以 Anscombe 的四重奏为例,我所拥有的是:

library(ggplot2)
library(gridExtra)
base <- ggplot() + xlim(4,19)
plots = vector(mode = "list", length = 4)
for(i in 1:4) {
  x <- anscombe[,i]
  y <- anscombe[,i+4]
  p <- geom_point(aes(x,y),colour="blue")
  q <- geom_smooth(aes(x,y),method="lm",colour="red",fullrange=T)
  plots[[i]] <- base+p+q
}
grid.arrange(grobs = plots,ncol=2)

当我通过循环时,我希望将图 p 和 q 的当前值与基本图一起添加到列表的第 i 个值中。也就是说,列表元素编号 i 包含与数据集中第 i 个 x 和 y 列相关的图。

然而,最后的情节只被绘制了四次。我使用mfrowplotabline 对基本 R 做了一些非常相似的事情,所以我相信我的逻辑是正确的,但我的实现不是。我怀疑问题出在以下几行:

plots = vector(mode = "list", length = 4)
plots[[i]] <- base+p+q

如何创建 ggplot 图形列表;从一个空列表开始?

(如果这是一个微不足道和愚蠢的问题,我很抱歉。我对 R 和图形语法都很陌生。)

【问题讨论】:

    标签: r list ggplot2 gridextra


    【解决方案1】:

    如果使用 lapply() 而不是 for 循环,则代码可以正常工作。

    plots <- lapply(1:4, function(i) { 
      # create plot number i
    })
    

    这个问题的原因是 ggplot 使用了惰性求值。当绘图被渲染时,循环已经迭代到i=4,最后一个绘图将显示四次。

    完整的工作示例:

    library(ggplot2)
    library(gridExtra)
    base <- ggplot() + xlim(4,19)
    plots <- lapply(1:4, function(i) {
      x <- anscombe[,i]
      y <- anscombe[,i+4]
      p <- geom_point(aes(x,y),colour="blue")
      q <- geom_smooth(aes(x,y),method="lm",colour="red",fullrange=T)
      base+p+q
    })
    grid.arrange(grobs = plots,ncol=2)
    
    

    【讨论】:

    • 非常感谢!同样,循环和应用(或“应用”)之间的细微差别是我非常不清楚的。了解更多...
    【解决方案2】:

    要强制评估,有一个简单的解决方案,将 aes(...) 更改为 aes_(...) 并且您的代码可以正常工作。

    library(ggplot2)
    library(gridExtra)
    base <- ggplot() + xlim(4,19)
    plots <- lapply(1:4, function(i) {
      x <- anscombe[,i]
      y <- anscombe[,i+4]
      p <- geom_point(aes_(x,y),colour="blue")
      q <- geom_smooth(aes_(x,y),method="lm",colour="red",fullrange=T)
      base+p+q
    })
    grid.arrange(grobs = plots,ncol=2)
    

    【讨论】:

    • 非常感谢!我不知道aesaes_ 之间的区别。这么多东西要学……这么小的大脑可以把它们塞进……
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 2021-09-21
    • 2017-08-22
    • 1970-01-01
    • 2022-08-09
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多