使用 for 循环 R 创建多个 ggplots 的问题

时间:2021-01-06 23:34:39

标签: r for-loop ggplot2

我正在尝试创建 6 个 ggplot 对象,绘制相同的图形但标记不同,标记存储在对象中{1:6}

ggrun<- c(1,2,3,4,5,6) 
for(i in ggrun) {assign(paste0("ggplot_", i), 
(ggplot(DF1, aes(x=X, y=Y, color=as.factor(get(paste0("object", i))[["cluster"]]))) + geom_point(fill = NA, size=1, alpha=0.6)))}

但这产生了 6 个相同的对象,具有正确的 {1:6} 名称,但都具有相同的 object6 值。

我也检查了我的 for 循环,

for(i in ggrun) {print(table(get(paste0("hdbscan_object", ggrun[i]))[["cluster"]]))}

它吐出 6 个不同的表。

此外,要确保它不是我的绘图命令:

grid.arrange(grobs = g, ncol(3), nrow(2), top="Title of Graphs")

我手动分配了列表对象中的每个项目,例如:

g[[5]] = ggplot(DF1, aes(x=PC1, y=PC4, color=as.factor(get(paste0("object", "5"))[["cluster"]])))  
+ geom_point(fill = NA, size=1, alpha=0.6)

并且它运行正确。

2 个答案:

答案 0 :(得分:1)

ggplot 使用 for 循环有点奇怪,因为许多内部操作似乎依赖于指针而不是实际存储值。要解决此问题,您通常需要为它们创建一个新环境,以防止指针指向的值被更改。

您可以尝试将值存储在列表中并使用 lapply 函数:

g <- lapply(1:6, 
            function (x){
                ggplot(DF1, aes(x=PC1, y=PC4, 
                       color=as.factor(get(paste0("object", x))[["cluster"]]))) + 
                    geom_point(fill = NA, size=1, alpha=0.6)
            }
     )

答案 1 :(得分:1)

这是使用 mget 的另一种方式:

library(ggplot2)

lapply(mget(paste0("object", 1:6)), function(x) {
  ggplot(DF1, aes(x=PC1, y=PC4, 
                  color= factor(x[["cluster"]]))) + 
    geom_point(fill = NA, size=1, alpha=0.6)
}) -> list_plots

list_plots