使用for循环创建多个ggplots

时间:2019-12-23 04:15:56

标签: r for-loop ggplot2

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循环代码后总是得到相同的图片?

4 个答案:

答案 0 :(得分:1)

如果您查看所获得的图,则它是最后出现的图。 ggplot2仅在调用该函数时对其求值。并且通过输入x值为icadata [[i]],ggplot2仅绘制icadata [[16]]。

因此,如果您确实需要使用for循环,则最好直接将其指向icadata中的列:

{{1}}

答案 1 :(得分:0)

python evaluate_performance.py

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

答案 2 :(得分:0)

我已经能够使用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]]

enter image description here

请注意,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"

答案 3 :(得分:-2)

在for循环之前,您可能需要创建所需大小的空列表。

p <- vector(length = length(c(2:13,16)), mode = "list")