2013-12-18 11 views
6

Chcę wykreślić kilka kolumn macierzy danych względem jednej kolumny, więc zamiast rysować każdą kolumnę osobno, używam pętli. Problem polega na tym, że nazwa kolumny do wykreślenia i kolor muszą być zmienne, jeśli mam użyć pętli. Próbowałem następujące:Przekazywanie koloru jako zmiennej do aes_stringa

allDs <- sort(unique(plotdata$D)) 
p <- ggplot(plotdata, aes(SpaceWidth)) 
for (thisD in allDs) { 
    tlColName <- paste("M2D", thisD, "Tl", sep="") 
    colorName <- paste("D", thisD, sep="") 
    p <- p + geom_line(data = plotdata[!is.na(plotdata[[tlColName]]),], aes_string(y = tlColName, color = colorName)) 
} 
p <- p + scale_colour_manual("Legend", values = c("D2" = "blue", "D3" = "red", "D4" = "green", "D6" = "violet", "D7" = "yellow")) 
p <- p + scale_x_log10(breaks = composite$SpaceWidth) 
p <- p + facet_wrap(~ Drawn, ncol = 3) 
p <- p + labs(title = "Fu plot", y = "MTN") 
p 

Ale gdy uruchomię to pojawia się następujący błąd:

Error in eval(expr, envir, enclos) : object 'D2' not found 

Jak kolor (lub jakakolwiek inna wartość) być przekazywane jako zmiennej w aes_string? Z góry dziękuję.

Dostępne są dane do testów here.

+1

Czy możesz podać próbkę swoich danych? spróbuj użyć 'dput (head (plotData, 100)) i wklej jej wynik na twoje pytanie. –

+0

FYI - błąd oznacza, że ​​kolumna 'D2' nie jest faktycznie obecna w ramce danych' plotdata'. To powiedziawszy, istnieje prawdopodobnie inny (lepszy) sposób osiągnięcia tego, o co prosisz, bez użycia pętli for. –

+0

Ale problem wydaje się być związany z wartością "koloru", którą przechodzę. Jeśli usuniemy kolor z aes_string działka działa. W każdym razie byłoby bardzo pomocne, gdybyś mógł mi powiedzieć, jak to zrobić lepiej i we właściwy sposób. – Dronacharya

Odpowiedz

3

Przyczyna błędu jest dość oczywista: D2 nie występuje w oryginalnym zbiorze danych. Zauważ, że możesz odwzorować kolor bezpośrednio na zmienną D, więc twoja konstrukcja colorName jest zbędna. Sprawdź to:

allDs <- sort(unique(plotdata$D)) 
plotdata$D <- as.factor(plotdata$D) 
p <- ggplot(plotdata, aes(SpaceWidth, color=D)) 
for (thisD in allDs) { 
    tlColName <- paste("M2D", thisD, "Tl", sep="") 
    p <- p + geom_line(data = plotdata[!is.na(plotdata[[tlColName]]),], 
      aes_string(y = tlColName)) 
} 
p <- p + scale_colour_manual("Legend", 
     values = c("blue", "red", "green", "violet", "yellow")) 
p <- p + scale_x_log10(breaks = plotdata$SpaceWidth) 
p <- p + facet_wrap(~ D, ncol = 3) 
p <- p + labs(title = "Fu plot", y = "MTN") 
p 

Pamiętaj, że aby właściwie odwzorować kolor, musisz go najpierw przekonwertować na czynnik. enter image description here

UPD: Cóż, pozwól mi pokazać, w jaki sposób pozbyć się pętli, co generalnie nie jest dobrą praktyką.

library(reshape2) 
melt.plotdata <- melt(plotdata, id.vars=c("SpaceWidth", "D")) 
melt.plotdata <- melt.plotdata[order(melt.plotdata$SpaceWidth), ] 
melt.plotdata <- na.omit(melt.plotdata) 
q <- ggplot(melt.plotdata, aes(SpaceWidth, value, colour=variable)) + geom_path() 
q + scale_colour_manual("Legend", 
         values = c("blue", "red", "green", "violet", "yellow")) + 
    scale_x_log10(breaks = melt.plotdata$SpaceWidth) + 
    facet_wrap(~ D, ncol = 3) + 
    labs(title = "Fu plot", y = "MTN") 

Fabuła będzie identyczna z tą, którą zamieściłem powyżej.

+0

Dzięki! pozwól mi spróbować :) – Dronacharya

Powiązane problemy