R:在 ggplot2 geom_line 中循环变量时出错

R: Error looping variable in in ggplot2 geom_line

我正在尝试使用 for 循环将多行添加到绘图中。使用 i 作为变量在我的数据中导航,出于某种原因,我突然在 ggplot 部分收到错误,说找不到该对象 i ("Error in as.name(names(data$SURF)[i]) : object 'i' not found")。似乎只接受那些链接到给 ggplot 的数据框的变量。我以前在 ggplots 中使用过不同的变量,所以我不知道为什么它现在不起作用。这是我的代码:

library(ggplot2)

  #creating object 'data' for example purpose
  surf <- list()
  day <- c(1:7)
  for(i in 1:5){
    surf[[i]] <- data.frame(day*i, day-i)
    names(surf)[i] <- paste("var",i,sep = "")
    colnames(surf[[i]]) <- c("T0", "whatever")
  }

  data <- list(surf)
  names(data)[1] <- "SURF"
  df <- data.frame(day)
  ret <- ggplot(df, aes(x=day))
  for(i in 1:length(names(data$SURF))){
    df[,i+1] <- data$SURF[[i]]$T0
    colnames(df)[i+1] <- names(data$SURF)[i]
    ret <- ret + geom_line(data = df, aes(y=as.name(names(data$SURF)[i]), colour= names(data$SURF)[i]))
  }

我设法以一种不完全令人满意的方式解决了问题,方法是在绘图部分省略了新变量。不过,我对这个解决方案并不完全满意,因为我想继续使用更自动化的代码。这是“肮脏”的解决方案:

  df <- data.frame(day)
  ret <- ggplot(df, aes(x=day))
  for(i in 1:length(names(data$SURF))){
    df$y <- data$SURF[[i]]$T0
    df$name <- names(data$SURF[i])
    ret <- ret + geom_line(data = df, aes(y=y, colour= name))
  }

如果有人能帮我弄清楚为什么在这个例子中使用 'external' 变量 i 不起作用,我将不胜感激。

感谢您的帮助。我明白了,我的脑子在想错误的方向,而且方式太复杂了。使用 reshape2 包的 melt() 函数确实为我提供了实现此目的所需的一切。对于任何感兴趣的人,这是我解决问题的方法:

library(reshape2)
library(ggplot2)

for(i in 1:length(data$SURF)){
    df[,i+1] <- data$SURF[[i]]$T0
}
colnames(df) <- c("day", names(data$SURF))
mlt <- melt(data = df, id.vars = "day")
ret <- ggplot(mlt) +
    aes(x=day, y=value, group=variable, colour = variable) +
    geom_line()