【问题标题】:multiple ggplots in for loop, always same plotfor循环中的多个ggplots,总是相同的情节
【发布时间】:2017-05-12 11:40:28
【问题描述】:

所以我有一个数据框 tmp,每一列都遵循不同的分布。我想要做的是在 pdf 中绘制直方图,每页一个直方图。但为什么我得到三倍相同的直方图?

当我输入 g11 时,我得到直方图 g13,但是当我在 pdf 中绘制直方图时,而不是 3 个相同的页面(直方图 1-3),我得到 3 个不同的页面,上面有相同的直方图。

可能是 ggplot 使用指针工作,并且由于第二个 for 循环,它绘制了 g1i?

有没有办法重写我的代码? (这个例子是从我的问题中简化的)

    tmp <- data.frame(x=rnorm(n=20, mean=0, sd=1),
                  y=rnorm(n=20, mean=10, sd=2),
                  z=rnorm(n=20, mean=40, sd=5))

for (i in 1:3){
  assign(paste("g1", i, sep=""),ggplot(tmp,aes(x=get(colnames(tmp)[i]))) + geom_histogram(binwidth=1))
}

pdf("/pathto/plot.pdf")
for(i in 1:3){
  #i <- 1
  grid.arrange(get(paste("g1", 1, sep="")), get(paste("g1", 2, sep="")), get(paste("g1", 3, sep="")))
}
dev.off()

【问题讨论】:

    标签: r for-loop plot ggplot2


    【解决方案1】:

    我认为第一个 for 循环中的 get 没有正确更改列。 你可以试试这个:

    for (i in 1:3){
        assign(paste("g1", i, sep=""),ggplot(tmp,aes_string(x=colnames(tmp)[i])) + geom_histogram(binwidth=1))
    }
    

    【讨论】:

    • 成功了!简单易行的解决方法。但是 aes_string 在做什么呢? (我阅读了帮助页面,但最好了解 ggplot 的工作原理以及它为什么不创建“关闭”对象)
    • 通常 ggplot 会懒惰地评估 aes 名称中的值,因此它会获取您传递的值并在父 data.frame 中查找它们(这就是您不必正常引用它们的原因) .然而,如果你使用colnames,你返回的是一个字符串,所以你必须明确告诉ggplotaes中的参数是使用aes_string引用的字符串。还有其他解决方法,但我认为这是最简单的。
    【解决方案2】:

    我会像下面的代码那样重写它。 首先,我将数据从宽格式转换为长格式,然后对每个级别(x、y、z)进行子集化并绘制它。

    library(ggplot2)
    library(tidyr)
    
    tmp <- data.frame(x=rnorm(n=20, mean=0, sd=1),
                      y=rnorm(n=20, mean=10, sd=2),
                      z=rnorm(n=20, mean=40, sd=5))
    
    xy <- gather(tmp)
    
    pdf("histogram.pdf")
    for (i in unique(xy$key)) {
      x <- droplevels(xy[xy$key == i, ])
      print(
        ggplot(x, aes(x = value)) +
        theme_bw() +
        geom_histogram()
      )
    }
    dev.off()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 2020-09-29
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多