在 for 循环中使用 ggplot, assing(paste0)) 时出现问题

问题描述 投票:0回答:1

我正在尝试在 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)) 放在循环末尾以查看发生了什么,但循环内的图是正确的。但是当我尝试时在循环之外绘制我遇到了上面的问题。

r for-loop ggplot2 assign
1个回答
0
投票

不要使用

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"
对象,它们自己绘制。

© www.soinside.com 2019 - 2024. All rights reserved.