Mam pytanie dotyczące legend w ggplot2. Udało mi się narysować trzy linie na tym samym wykresie i chcę dodać legendę z trzema użytymi kolorami. To jest używany kod
library(ggplot2)
require(RCurl)
link<-getURL("https://dl.dropbox.com/s/ds5zp9jonznpuwb/dat.txt")
datos<- read.csv(textConnection(link),header=TRUE,sep=";")
datos$fecha <- as.POSIXct(datos[,1], format="%d/%m/%Y")
temp = ggplot(data=datos,aes(x=fecha, y=TempMax,colour="1")) +
geom_line(colour="red") + opts(title="TITULO") +
ylab("Temperatura (C)") + xlab(" ") +
scale_y_continuous(limits = c(-10,40)) +
geom_line(aes(x=fecha, y=TempMedia,colour="2"),colour="green") +
geom_line(aes(x=fecha, y=TempMin,colour="2"),colour="blue") +
scale_colour_manual(values=c("red","green","blue"))
temp
i wyjście
Chciałbym dodać legendę z trzema użytymi kolorami i nazwą zmiennej (TempMax, TempMedia i TempMin). próbowałem
scale_colour_manual
ale nie mogę znaleźć dokładnej drogi.
Niestety, oryginalne dane zostały usunięte z połączonej witryny i nie można ich było odzyskać. Ale pochodzą z plików danych meteo w tym formacie
"date","Tmax","Tmin","Tmed","Precip.diaria","Wmax","Wmed"
2000-07-31 00:00:00,-1.7,-1.7,-1.7,-99.9,20.4,20.4
2000-08-01 00:00:00,22.9,19,21.11,-99.9,6.3,2.83
2000-08-03 00:00:00,24.8,12.3,19.23,-99.9,6.8,3.87
2000-08-04 00:00:00,20.3,9.4,14.4,-99.9,8.3,5.29
2000-08-08 00:00:00,25.7,14.4,19.5,-99.9,7.9,3.22
2000-08-09 00:00:00,29.8,16.2,22.14,-99.9,8.5,3.27
2000-08-10 00:00:00,30,17.8,23.5,-99.9,7.7,3.61
2000-08-11 00:00:00,27.5,17,22.68,-99.9,8.8,3.85
2000-08-12 00:00:00,24,13.3,17.32,-99.9,8.4,3.49
Odpowiedzi:
Zwykle stwierdzam, że jeśli określam poszczególne kolory w wielu geomach, robię to źle. Oto jak narysowałbym twoje dane:
Pozostało tylko proste polecenie ggplot:
Przykładowa fabuła
źródło
Ponieważ @Etienne zapytał, jak to zrobić bez topienia danych (co ogólnie jest metodą preferowaną, ale zdaję sobie sprawę, że mogą być przypadki, w których nie jest to możliwe), przedstawiam następującą alternatywę.
Zacznij od podzbioru oryginalnych danych:
Możesz uzyskać pożądany efekt (a to również czyści oryginalny kod kreślenia):
Chodzi o to, że każdej linii nadaje się kolor poprzez odwzorowanie
colour
estetyki na stały ciąg. Najłatwiej jest wybrać ciąg, który ma się pojawić w legendzie. Fakt, że w tym przypadku jest to to samo, co nazway
wykreślanej zmiennej nie ma znaczenia; może to być dowolny zestaw ciągów. Bardzo ważne jest, aby miało to miejsce w trakcieaes
rozmowy; tworzysz mapowanie na tę „zmienną”.scale_colour_manual
może teraz odwzorować te ciągi na odpowiednie kolory. Wynik toW niektórych przypadkach mapowanie między poziomami i kolorami wymaga wyraźnego nazwania wartości w skali ręcznej (dzięki @DaveRGP za zwrócenie uwagi):
(podając taką samą liczbę jak poprzednio). W przypadku nazwanych wartości, podziały mogą służyć do ustawiania kolejności w legendzie i dowolnej kolejności w wartościach.
źródło
scale_colour_manual("", values = c("TempMax" = "red", "TempMedia" = "green", "TempMin" = "blue"))
którym TempMax, TempMedia i TempMin są określone jako argument koloru, jak w powyższej odpowiedzi.Bardzo podoba mi się rozwiązanie zaproponowane przez @Brian Diggs. Jednak w moim przypadku wykresy liniowe tworzę w pętli, zamiast podawać je bezpośrednio, ponieważ nie wiem, ile wykresów będę miał. Kiedy próbowałem dostosować kod @ Brian, napotkałem pewne problemy z poprawną obsługą kolorów. Okazało się, że muszę zmodyfikować funkcje estetyczne. Jeśli ktoś ma ten sam problem, oto kod, który działał dla mnie.
Użyłem tej samej ramki danych co @Brian:
W moim przypadku generuję
my.cols
imy.names
dynamicznie, ale nie chcę niepotrzebnie komplikować rzeczy, więc podaję je tutaj wprost. Te trzy wiersze ułatwiają porządkowanie legendy i przypisywanie kolorów.A oto fabuła:
źródło
ggplot
.