Un foarte newbish întrebare, dar spun că au date de genul asta:
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)
)
Cum pot complot ambele serii de timp var0
și var1
, pe același grafic, cu "data" pe axa x, folosind ggplot2
? Puncte Bonus dacă ați face var0
și var1
diferite culori, și poate include o legendă!
Am'sunt sigur că acest lucru este foarte simplu, dar nu pot't găsi orice exemple de acolo.
Pentru un număr mic de variabile, puteți construi intriga manual tine:
ggplot(test_data, aes(date)) +
geom_line(aes(y = var0, colour = "var0")) +
geom_line(aes(y = var1, colour = "var1"))
Abordarea generală este de a converti datele de format lung (folosind topi()
la pachet remodela " sau "reshape2") sau "aduna()
/`pivot_longer () "de la" tidyr pachetului:
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()
Ai nevoie de date pentru a fi în "înalt" format în loc de "larg" pentru ggplot2. "larg" înseamnă a avea o observație pe rând cu fiecare variabilă ca o coloană diferită (ca și cum ai avea acum). Ai nevoie pentru a converti de la un "înalt" format în cazul în care aveți o coloană care-ti spune numele variabilei și o altă coloană care indică valoarea variabilei. Procesul de trecere de la wide la inaltime este de obicei numit "de topire". Puteți folosi tidyr::adunați-vă pentru a topi cadru de date:
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()
Doar pentru a fi clar "date" care ggplot
este consumatoare de după conducte prin aduna
se pare ca acest lucru:
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
Folosind datele:
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))
Am crea un stivuite versiune care este ce ggplot ()
- ar dori să lucreze cu:
stacked <- with(test_data,
data.frame(value = c(var0, var1),
variable = factor(rep(c("Var0","Var1"),
each = NROW(test_data))),
Dates = rep(Dates, 2)))
În acest caz produc stacked
a fost destul de ușor ca ne-am avut doar pentru a face o serie de manipulări, dar remodela () " și "remodela" și " reshape2
ar putea fi util dacă aveți mai complex real set de date pentru a manipula.
Odată ce datele sunt în această formă suprapuse, este nevoie de doar un simplu ggplot()
apel pentru a produce complot ai vrut, cu toate dotarile (un motiv de nivel superior trasarea pachete ca zăbrele " și " ggplot2
sunt atât de utile):
require(ggplot2)
p <- ggplot(stacked, aes(Dates, value, colour = variable))
p + geom_line()
Am'll las pe tine să curețe etichetele axelor, legenda titlu etc.
HTH
De asemenea, sunt nou să R, dar încearcă să înțeleagă cum ggplot lucrări cred că am obține un alt mod de a face asta. Am împărtășească probabil că nu, fiind o soluție perfectă, dar pentru a adăuga unele puncte de vedere diferite.
Știu ggplot este făcut pentru a lucra cu dataframes mai bine, dar poate fi, de asemenea, uneori util să știți că puteți direct complot doi vectori, fără a utiliza un dataframe.
Încărcare de date. Data inițială vector de lungime este de 100, în timp ce var0 și var1 au lungimea de 50 deci nu numai complot datele disponibile (primii 50 de date).
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=50)
Trasarea
ggplot() + geom_line(aes(x=date,y=var0),color='red') +
geom_line(aes(x=date,y=var1),color='blue') +
ylab('Values')+xlab('date')
Cu toate acestea eu nu am fost capabil de a adăuga o corectă legenda folosind acest format. Stie cineva cum?