我正在尝试在 data.frame 中使用 for 循环来使用 ggplot 创建多个绘图。不同情况下,图的数量也不同。我使用的代码如下:
for(i in colnames(AUX_GRAF[2: ncol(AUX_GRAF)])){
AUX01 <- as.numeric(AUX_GRAF[, i])
AUX <- ggplot (AUX_GRAF,
aes(x = reorder(SE, as.numeric(SE)),
y = AUX01)) +
theme(axis.text.x = element_text(face = "bold")) +
labs(caption = "Fonte",
x = "Semana Epidemiológica",
y = "Número de Casos",
title = paste0(i, " - Notificados"))+
theme( panel.grid.major = element_line(color = "#C0C0C0"),
panel.grid.minor = element_blank(),
panel.background = element_rect(fill = "#F5F5F5"),
plot.title = element_text(face = "bold",
size = 15,
colour = "#556B2F")) +
geom_bar(stat = "identity",
color = "black",
fill = "#8FBC8F") +
geom_label(aes(label = AUX01),
alpha = 0.5,
vjust = 0.1) +
scale_y_continuous(expand = expansion(mult = c(0, 0.05)))
assign(paste0("SE_HIST_NOT_", i), AUX)
Sys.sleep(1)
print(assign(paste0("SE_HIST_NOT_", i), AUX))
rm(AUX)
}
AUX_GRAF 是我正在尝试绘制的 data.frame。 我尝试不同的方法来做到这一点,但每种方法都得到相同的结果。 geom_label 是对的,标题是对的,但 geon_bar 始终与上次迭代相同。
我不知道发生了什么。
我将 Sys.sleep 和 rint(assign(paste0("SE_HIST_NOT_", i), AUX)) 放在循环末尾以查看发生了什么,但循环内的图是正确的。但是当我尝试时在循环之外绘制我遇到了上面的问题。
不要使用
assign
创建许多对象,而是将绘图存储在一个列表中,仅存储在一个对象中。for
循环,可以按如下方式完成。
# call this just once
cnames <- colnames(AUX_GRAF[2:ncol(AUX_GRAF)])
# create a named list of appropriate length
plot_list <- setNames(vector("list", length(cnames)), cnames)
for(i in cnames) {
# [...your code...]
# [...but just until 'assign'...]
plot_list[[i]] <- AUX
Sys.sleep(1)
}
# do this just once too
rm(AUX)
并且使用
lapply
循环,您不必事先创建绘图列表。
plot_list <- lapply(cnames, \(i) {
# [...your code...]
# [...but just until 'assign'...]
Sys.sleep(1)
# function return value
AUX
})
names(plot_list) <- cnames
# no need to rm(AUX), it is gone as soon as the
# anonymous function in the lapply loop returns
假设上面的第一列名为
"col1"
。现在可以使用以下任意一个访问第一个图
# all exactly the same
plot_list[[1]]
plot_list[["col1"]]
plot_list$col1
并且不需要明确的
plot
。创建的对象,列表成员已经是"ggplot"
对象,它们自己绘制。