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