2010-09-23 14 views
203

Bardzo newbish zapytania, ale że mam danych tak:kreślenie dwie zmienne w postaci linii korzystających ggplot2 na tym samym wykresie

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ć obu szeregów czasowych var0 i var1 na tym samym wykresie, z date na osi X, używając ggplot2? Dodatkowe punkty, jeśli dokonasz var0 i var1 różnych kolorów i mogą zawierać legendę!

Jestem pewien, że to bardzo proste, ale nie mogę znaleźć tam żadnych przykładów.

Odpowiedz

259

dla małej liczby zmiennych, można wykorzystać budować fabułę ręcznie siebie:

ggplot(test_data, aes(date)) + 
    geom_line(aes(y = var0, colour = "var0")) + 
    geom_line(aes(y = var1, colour = "var1")) 
+1

ładny przykład, ale jak spersonalizować własne kolory (Np. Czarny i pomarańczowy) ?, ponieważ wydaje się, że używasz 'color =' jako nazwy zmiennej. –

+8

Użyj skali .... – hadley

+3

'+ scale_colour_manual (values ​​= c (" black "," orange "))' –

12

Korzystanie swoje dane:

test_data <- data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))), 
var1 = 150 + c(0, cumsum(runif(49, -10, 10))), 
Dates = seq.Date(as.Date("2002-01-01"), by="1 month", length.out=100)) 

utworzyć ułożone wersję, która jest co ggplot() chcieliby pracować z:

stacked <- with(test_data, 
       data.frame(value = c(var0, var1), 
          variable = factor(rep(c("Var0","Var1"), 
               each = NROW(test_data))), 
          Dates = rep(Dates, 2))) 

W tym przypadku produkujących stacked było dość proste, jak mieliśmy tylko do wykonaj kilka manipulacji, ale reshape() i reshape i reshape2 mogą być przydatne, jeśli masz bardziej złożony zestaw danych rzeczywistych do manipulowania.

Gdy dane są w tej formie ułożone, wymaga jedynie prostego ggplot() wezwanie do wytworzenia działkę chciałeś ze wszystkimi dodatkami (jeden powód, dlaczego pakiety kreślenia wyższego poziomu jak lattice i ggplot2 są tak przydatne):

require(ggplot2) 
p <- ggplot(stacked, aes(Dates, value, colour = variable)) 
p + geom_line() 

zostawię ci go posprzątać etykiety osi, tytuł legendy itp

HTH

+1

Chyba w twojej kodzie znajdują się źle umieszczone pareny. Myślę, że to jest to, czego szukasz: skumulowany <- z (test_data, data.frame (wartość = c (var0, var1), zmienna = czynnik (rep (c ("Var0", "Var1"))), każdy = NROW (test_data), Dates = rep (date, 2))). Jaki jest cel kolumny "każdy"? I czy jest to nie tylko bardziej skomplikowany i mniej skuteczny sposób na stopienie danych, jak pokazuje rcs? Sądzę, że mógłbym sobie wyobrazić przypadek, w którym stop nie wykonałby zadania, ale prawie na pewno jest to odpowiednie narzędzie do tej pracy, chyba że czegoś mi brakuje? – Chase

+1

@chase, przepraszam, to znaczy, że Emacs ESS źle odczytuje wcięcia. każdy jest argumentem dla 'rep()', więc naprawdę dostajemy tylko 3 coli w 'stacked'. Zmienię kod, aby wcięcie było wyraźniejsze. –

+1

@chase; Twój komentarz na temat 'melt()' jest dobrze zrobiony i zauważam, że pakiet reshape [2] byłby użyteczny. Nie jestem zaznajomiony z reshape2 i dla tak prostej manipulacji wykonanej ręcznie jest bardziej skomplikowana niż wywołanie 'melt()', to było mniej wysiłku, ponieważ nie potrzebowałem czytać jak używać 'melt() '. I rcs zakradł się z jego odpowiedzią podczas gdy ja tworzyłem mój; kiedy zacząłem odpowiadać, nie było odpowiedzi. więcej niż jeden sposób na skórze kota - jak mówią! ;-) –

272

Ogólne podejście jest konwersja danych do formatu długi (za pomocą melt() z pakietu reshape lub reshape2) lub gather() z pakietu tidyr:

library("reshape2") 
library("ggplot2") 

test_data_long <- melt(test_data, id="date") # convert to long format 

ggplot(data=test_data_long, 
     aes(x=date, y=value, colour=variable)) + 
     geom_line() 

ggplot2 output

+4

Możesz także użyć funkcji 'gather()' pakietu 'tidyr' do stopienia danych:' gather (test_data, variable, value, -date) ' – janosdivenyi

12

Potrzebujesz danych do "wysokiego" formatu zamiast "szerokiego" dla ggplot2. "szeroki" oznacza obserwację w wierszu z każdą zmienną jako inną kolumnę (jak teraz). Musisz przekonwertować go na "wysoki" format, w którym masz kolumnę z nazwą zmiennej i inną kolumną, która mówi ci wartość zmiennej. Proces przejścia od szerokiego do wysokiego jest zwykle nazywany "topieniem".Można użyć tidyr::gather topnieć ramki danych:

library(ggplot2) 
library(tidyr) 

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) 
) 
test_data %>% 
    gather(key,value, var0, var1) %>% 
    ggplot(aes(x=date, y=value, colour=key)) + 
    geom_line() 

multiple series ggplot2

Wystarczy być jasne data że ggplot zużywa po rurociągów go poprzez gather wygląda następująco:

date  key  value 
2002-01-01 var0 100.00000 
2002-02-01 var0 115.16388 
... 
2007-11-01 var1 114.86302 
2007-12-01 var1 119.30996 
Powiązane problemy