我正在尝试创建 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)
并且它运行正确。
答案 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