2015-09-24 56 views
0

我正嘗試使用for循環將多行添加到圖中。使用i作爲變量來導航我的數據,出於某種原因,我突然發現ggplot部分有錯誤,說我沒有找到該對象(「as.name中的錯誤(名稱(數據$ SURF) [i]):object'i'not found「)。似乎只有那些被接受的變量被鏈接到給ggplot的數據幀。我在ggplots之前使用過不同的變量,所以我不知道爲什麼現在不起作用。這是我的代碼:R:ggplot2中的循環變量出錯geom_line

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)) 
    } 

我會很感激,如果有人可以幫助我弄清楚爲什麼使用‘外部’變量i並不在這個例子中工作

+0

你爲什麼循環?一般來說,在ggplot,如果你要麼循環或添加t條他與你的情節相同的元素多次,你不正確的做法和按摩你的數據到另一種格式是更好的解決方案。 – Heroka

+1

我認爲如果您使用「reshape」或「tidy」等包將您的多列重新整理爲數據值和分組列,然後將ggplot用作預期的顏色,則可以節省很多痛苦'color = grouping_column' –

+0

@StephenHenderson,我如何將數據分組爲一個數據值和一個分組列?對不起,如果這是一個不必要的問題,但我不知道如何。 – oepix

回答

0

感謝我看到,我的頭腦在錯誤的方向思考,太複雜了,使用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()