使用循环图

时间:2020-09-06 10:22:31

标签: r ggplot2

嗨,我正在尝试使用for循环创建图并在我的全局环境中分配它们,如下所示:

library(ggplot2)
library(patchwork)

datasets::anscombe
#>    x1 x2 x3 x4    y1   y2    y3    y4
#> 1  10 10 10  8  8.04 9.14  7.46  6.58
#> 2   8  8  8  8  6.95 8.14  6.77  5.76
#> 3  13 13 13  8  7.58 8.74 12.74  7.71
#> 4   9  9  9  8  8.81 8.77  7.11  8.84
#> 5  11 11 11  8  8.33 9.26  7.81  8.47
#> 6  14 14 14  8  9.96 8.10  8.84  7.04
#> 7   6  6  6  8  7.24 6.13  6.08  5.25
#> 8   4  4  4 19  4.26 3.10  5.39 12.50
#> 9  12 12 12  8 10.84 9.13  8.15  5.56
#> 10  7  7  7  8  4.82 7.26  6.42  7.91
#> 11  5  5  5  8  5.68 4.74  5.73  6.89


for(i in 1:4){
  var = paste0('p', as.character(i))
  assign(
    x = var,
    value = (ggplot(anscombe, 
                   aes(x=get(paste0('x', as.character(i))), 
                       y=get(paste0('y', as.character(i))))) + geom_point()),
    envir=.GlobalEnv
  )
}

(p1 + p2)/(p3 + p4)

如您所见,所有生成的图都是相同的。但是,当我使用上面的相同代码而不使用for循环时,我得到了预期的图,例如:p1和p3如下所示。


p1 = ggplot(anscombe, aes(x=get(paste0('x', as.character(1))),
                          y=get(paste0('y', as.character(1))))) + geom_point() 

p3 = ggplot(anscombe, aes(x=get(paste0('x', as.character(3))),
                     y=get(paste0('y', as.character(3))))) + geom_point() 
p1 + p3

reprex package(v0.3.0)于2020-09-06创建

我的问题是为什么for循环不起作用?为什么会在for循环中为所有人生成p4图?

1 个答案:

答案 0 :(得分:1)

您可以通过创建列名称并将其传递给ggplot,然后有选择地用!!取消引号来简化此操作。

请注意,您已经在全局环境中,因此assign不需要envir参数。

for(i in 1:4) {
  var = paste0('p', i)
  x <- as.name(paste0("x", i))
  y <- as.name(paste0("y", i))
  assign(x = var, value = ggplot(anscombe, aes(!!x, !!y)) + geom_point())
}

(p1 + p2)/(p3 + p4)

enter image description here

顺便说一句,如果将所有图都保留在列表中,您可能会更简洁 避免将多个对象写入全局环境:

p <- lapply(1:4, function(i) {
  ggplot(anscombe, aes(!!as.name(paste0("x", i)), !!as.name(paste0("y", i)))) + 
    geom_point()
})

(p[[1]] + p[[2]])/(p[[3]] + p[[4]])
相关问题