【问题标题】:Using for loop to create multiple ggplots使用 for 循环创建多个 ggplots
【发布时间】:2019-12-23 04:15:56
【问题描述】:
p[[2]]<-ggplot(data = icadata, aes(x = icadata[[2]])) + geom_histogram()    
p[[3]]<-ggplot(data = icadata, aes(x = icadata[[3]])) + geom_histogram()    
p[[4]]<-ggplot(data = icadata, aes(x = icadata[[4]])) + geom_histogram()    
p[[5]]<-ggplot(data = icadata, aes(x = icadata[[5]])) + geom_histogram()    
p[[6]]<-ggplot(data = icadata, aes(x = icadata[[6]])) + geom_histogram()    
p[[7]]<-ggplot(data = icadata, aes(x = icadata[[7]])) + geom_histogram()    
p[[8]]<-ggplot(data = icadata, aes(x = icadata[[8]])) + geom_histogram()    
p[[9]]<-ggplot(data = icadata, aes(x = icadata[[9]])) + geom_histogram()    
p[[10]]<-ggplot(data = icadata, aes(x = icadata[[10]])) + geom_histogram()    
p[[11]]<-ggplot(data = icadata, aes(x = icadata[[11]])) + geom_histogram()    
p[[12]]<-ggplot(data = icadata, aes(x = icadata[[12]])) + geom_histogram()    
p[[13]]<-ggplot(data = icadata, aes(x = icadata[[13]])) + geom_histogram()    
p[[16]]<-ggplot(data = icadata, aes(x = icadata[[16]])) + geom_histogram()    

p <- list()    
for(i in c(2:13,16) ) {      
           p[[i]]<-ggplot(data = icadata, aes(x = icadata[[i]])) + geom_histogram()    
}     

上面的代码有什么区别?
为什么我在运行 for 循环代码后总是得到相同的图片?

【问题讨论】:

  • 欢迎来到 SO!志立,如果没有上下文,这没有什么意义,请注意,没有人知道你对icadata 做了什么。请让这个问题可重现。这包括示例代码(包括列出非基础 R 包)、示例明确数据(例如,dput(head(x))data.frame(x=...,y=...))和预期输出。参考:stackoverflow.com/questions/5963269stackoverflow.com/help/mcvestackoverflow.com/tags/r/info
  • 每次调用ggplot,它都会覆盖以前的绘图并在新的画布上绘制新绘图,然后显示最后绘制的绘图。这就是为什么每次运行代码时只得到最后一个图的原因,因为循环每次迭代都会生成一个新图。你想达到什么目的?
  • 我想在我的 icadata 中获取所有数值变量的直方图。逐个绘制很不方便,所以我尝试使用这个 for 循环来绘制它们并将它们保存在一个列表中。你知道如何改正吗?谢谢。
  • 你想把所有的直方图放到一个图中吗?那将是不可读的。改用构面会更有帮助。
  • 不在一个情节中,我想用一个列表来保存它们。

标签: r for-loop ggplot2


【解决方案1】:

如果你查看你得到的情节,它是最后出现的情节。 ggplot2 仅在您调用该函数时对其进行评估。通过将 x 值输入为 icadata[[i]],ggplot2 仅绘制 icadata[[16]]。

所以如果确实需要使用for循环,最好直接指向icadata里面的列:

icadata = data.frame(sapply(1:16,function(i)rnorm(100,i,1)))

for(i in c(2:13,16) ) {
COLUMN=colnames(icadata)[i]
p[[i]]<-ggplot(data = icadata, aes_(x = as.name(COLUMN))) + geom_histogram()  
# or use 
# p[[i]]<-ggplot(data = icadata, aes_string(x = COLUMN)) + geom_histogram()    
}  

grid.arrange(grobs=p[c(2:13,16)])

【讨论】:

    【解决方案2】:
    library(reshape2)
    d <- melt(icadata[,-c(1,14,15)])
    ggplot(d,aes(x = value)) + 
      facet_wrap(~variable,scales = "free_x") + 
      geom_histogram()
    

    我尝试了构面。它起作用了。但我仍然很困惑,为什么我不能使用该 for 循环代码获得一个绘图列表,除非我像我的代码的最开始那样一个接一个地绘制它们。

    【讨论】:

      【解决方案3】:

      我已经能够使用mtcars 数据集重现观察到的行为。在我看来,aes(x = icadata[[2]]) 的指定方式似乎是个问题。

      下面的代码对我有用:

      icadata <- as.data.frame(mtcars) # create reproducible data
      library(ggplot2)
      
      p <- list()    
      for(i in c(2:3, 6)) {
        p[[i]] <- ggplot(data = icadata, aes(x = !!sym(names(icadata)[i]))) + geom_histogram()    
      }    
      

      输出是 OP 要求的列表

      class(p)
      
      [1] "list"
      

      列表元素为空或ggplot 对象

      lapply(p, class)
      
      [[1]]
      [1] "NULL"
      
      [[2]]
      [1] "gg"     "ggplot"
      
      [[3]]
      [1] "gg"     "ggplot"
      
      [[4]]
      [1] "NULL"
      
      [[5]]
      [1] "NULL"
      
      [[6]]
      [1] "gg"     "ggplot"
      

      我可以绘制整个列表

      lapply(p, print)
      

      或单个图表,例如,

      p[[3]]
      

      请注意,x 轴由列名称标记,例如 disp 而不是 icadata[[3]]


      如果需要,for 循环可以替换为对lapply() 的调用,它返回一个不带空元素的list 对象。此外,列表元素可以适当命名。

      cols <- names(icadata)[c(2:3, 6)]
      p2 <- lapply(
        cols, 
        function(col) ggplot(data = icadata, aes(x = !!sym(col))) + geom_histogram()
        )
      names(p2) <- paste0(cols, "_histogram")
      
      lapply(p2, class)
      
      $cyl_histogram
      [1] "gg"     "ggplot"
      
      $disp_histogram
      [1] "gg"     "ggplot"
      
      $wt_histogram
      [1] "gg"     "ggplot"
      

      【讨论】:

      • 很抱歉再次打扰您。您能解释一下!!sym(col)吗?和as.name()一样吗?
      猜你喜欢
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 2020-09-29
      • 2021-04-26
      • 2021-12-01
      • 2022-01-01
      • 1970-01-01
      • 2020-12-19
      相关资源
      最近更新 更多