Bardzo nowe pytanie, ale powiedz, że mam takie dane:
test_data <-
data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
date = seq(as.Date("2002-01-01"), by="1 month", length.out=100)
)
Jak mogę wykreślić zarówno szeregi czasowe, jak var0
i var1
ten sam wykres za pomocądate
na osi X, używając ggplot2
? Punkty bonusowe, jeśli wykonasz var0
i var1
różne kolory, i mogą zawierać legendę!
Jestem pewien, że jest to bardzo proste, ale nie mogę znaleźć żadnych przykładów.
colour=
jako nazwy zmiennej.colour='var_names'
jak określono przez hadley działa dobrze. ale @DaveX - byłoby bardziej szczegółowe, jeśli ktoś chce wybrać określone kolory zamiast automatycznie wybieranych kolorów przez funkcję.Ogólne podejście polega na konwertowaniu danych na długi format (przy użyciu
melt()
z pakietureshape
lubreshape2
) lubgather()
/pivot_longer()
ztidyr
pakietu:Zobacz także to pytanie dotyczące przekształcania danych z szerokiego na długi.
źródło
gather()
funkcjitidyr
pakiet do stopienia danych:gather(test_data, variable, value, -date)
Musisz mieć dane w formacie „wysokim” zamiast „szerokiego” dla ggplot2. „szeroki” oznacza obserwację w wierszu z każdą zmienną jako inną kolumną (tak jak teraz). Musisz przekonwertować go na format „wysoki”, w którym masz kolumnę z nazwą zmiennej i inną kolumnę z informacją o wartości zmiennej. Proces przechodzenia z szerokiego na wysoki jest zwykle nazywany „topieniem”. Możesz użyć
tidyr::gather
do stopienia ramki danych:Żeby było jasne,
data
żeggplot
to, co zużywa po przepuszczeniu,gather
wygląda następująco:źródło
Korzystanie z danych:
Tworzę wersję skumulowaną, z którą
ggplot()
chciałbym pracować:W tym przypadku wytwarzania
stacked
było dość proste, jak mieliśmy tylko zrobić parę manipulacji, alereshape()
ireshape
, areshape2
może być przydatne, jeśli mają bardziej złożony zestaw danych rzeczywistych do manipulowania.Gdy dane są już w tej skumulowanej formie, wystarczy tylko jedno
ggplot()
wywołanie, aby utworzyć żądany wykres ze wszystkimi dodatkami (jeden z powodów, dla których pakiety wydruku wyższego poziomu lubiąlattice
iggplot2
są tak przydatne):Pozostawiam do uporządkowania etykiet osi, tytułu legendy itp.
HTH
źródło
rep()
, więc naprawdę otrzymujemy tylko 3 colsstacked
. Zmodyfikuję kod, aby wyraźniejsze było wcięcie.melt()
jest dobrze przyjęty i zauważam, że przydatny byłby tutaj pakiet reshape [2]. Nie jestem zbyt obeznany z reshape2 i dla tak prostej manipulacji ręczne wykonanie tego zadania jest bardziej skomplikowane niż wezwanie domelt()
, że było to mniej wysiłku, ponieważ nie musiałem czytać, jak go używaćmelt()
. I rcs wkradł się z jego odpowiedzią, kiedy ja produkowałem moją; kiedy zacząłem odpowiadać, nie było odpowiedzi. więcej niż jeden sposób na skórowanie kota - jak mówią! ;-)Jestem również nowy w R, ale próbując zrozumieć, jak działa ggplot, myślę, że mam inny sposób, aby to zrobić. Po prostu udostępniam prawdopodobnie nie jako kompletne idealne rozwiązanie, ale dodając kilka różnych punktów widzenia.
Wiem, że ggplot jest lepiej przystosowany do pracy z ramkami danych, ale może czasem warto też wiedzieć, że możesz bezpośrednio wykreślić dwa wektory bez użycia ramki danych.
Ładowanie danych. Oryginalna długość wektora daty wynosi 100, podczas gdy var0 i var1 mają długość 50, więc wykreślam tylko dostępne dane (pierwsze 50 dat).
Konspiratorstwo
Nie byłem jednak w stanie dodać poprawnej legendy przy użyciu tego formatu. Czy ktoś wie jak?
źródło
ggplot() + geom_line(aes(x=date,y=var0, group=1, colour = 'red')) + geom_line(aes(x=date,y=var1, group = 2, colour = 'blue')) + ylab('Values')+xlab('date')