Rysowanie dwóch zmiennych jako linii za pomocą ggplot2 na tym samym wykresie

Bardzo nowe pytanie, ale powiedzmy, ż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 narysować zarówno szereg czasowy var0 jak i var1 na tym samym wykresie, z date na osi x, używając ggplot2? Punkty bonusowe, jeśli wykonasz var0 i var1 różne kolory i możesz dołączyć legendę!

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

Author: Henrik, 2010-09-23

4 answers

Dla niewielkiej liczby zmiennych, możesz użyć budowania wykresu ręcznie samodzielnie:

ggplot(test_data, aes(date)) + 
  geom_line(aes(y = var0, colour = "var0")) + 
  geom_line(aes(y = var1, colour = "var1"))
 293
Author: hadley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 16:12:22

Ogólne podejście polega na konwersji danych na długi format (używając {[1] } 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()

wyjście ggplot2

 298
Author: rcs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-09 14:52:34

Dane muszą być w formacie "tall" zamiast "wide" dla ggplot2. "wide" oznacza obserwację w wierszu z każdą zmienną jako inną kolumną(tak jak teraz). Musisz przekonwertować go do formatu "tall", w którym masz kolumnę, która informuje o nazwie zmiennej i inną kolumnę, która informuje o wartości zmiennej. Proces przechodzenia od szerokiego do wysokiego jest zwykle nazywany "topieniem". Możesz użyć tidyr::gather do stopienia swoich danych frame:

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

wiele serii ggplot2

Dla jasności data, Które ggplot zużywa po przepuszczeniu przez gather wygląda tak:

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
 21
Author: ecerulm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-20 09:21:47

Korzystanie z danych:

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

Tworzę wersję stacked, z którą ggplot() chciałby pracować:

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 tworzenie stacked było dość łatwe, ponieważ musieliśmy wykonać tylko kilka manipulacji, ale reshape() oraz reshape i reshape2 mogą być przydatne, jeśli masz bardziej złożony zestaw rzeczywistych danych do manipulowania.

Gdy dane są w tej formie, wymaga tylko prostego wywołania ggplot(), aby stworzyć plan, który chcesz ze wszystkimi dodatkami (jeden powód, dla którego Pakiety Wykresów wyższego poziomu, takie jak lattice i ggplot2 są tak przydatne):

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

Zostawiam ci uporządkowanie etykiet osi, tytułu legendy itp.

HTH

 12
Author: Gavin Simpson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 16:29:40