Kreślenie wielu szeregów czasowych na tym samym wykresie za pomocą ggplot()
Jestem całkiem nowy w R i staram się wykreślić dwie linie szeregów czasowych jednocześnie (przy użyciu różnych kolorów, oczywiście) korzystając z ggplot2.
Mam 2 ramki danych. pierwsza ma kolumny 'procent zmiany dla X' i 'data'. Drugi ma kolumny "procent zmiany dla Y" i "Data", jak również, to znaczy, oba mają kolumnę "Data" z tymi samymi wartościami, podczas gdy kolumny "procent zmiany" mają różne wartości.
Chciałbym wykreślić kolumny 'procentowa zmiana' przeciw 'Date' (wspólne dla obu) za pomocą ggplot2 na jednym wykresie.
Przykłady, które znalazłem w Internecie, wykorzystywały tę samą ramkę danych z różnymi zmiennymi, aby to osiągnąć, nie byłem w stanie znaleźć niczego, co wykorzystywałoby 2 ramki danych, aby dostać się do wykresu. Nie chcę wiązać dwóch ramek danych ze sobą, chcę je oddzielać. Oto kod, którego używam:
ggplot(jobsAFAM, aes(x=jobsAFAM$data_date, y=jobsAFAM$Percent.Change)) + geom_line() +
xlab("") + ylab("")
Ale ten kod tworzy tylko jedną linię I chciałbym dodać kolejną linię do niego. Dowolne pomoc będzie bardzo mile widziana. TIA.
5 answers
ggplot
pozwala mieć wiele warstw, i to jest to, co należy wykorzystać tutaj.
Na wykresie utworzonym poniżej widać, że istnieją dwa geom_line
stwierdzenia uderzające w każdy z Twoich zestawów danych i kreślące je razem na jednym wykresie. Można rozszerzyć tę logikę, jeśli chcesz dodać inny zestaw danych, Wykres, a nawet funkcje wykresu, takie jak etykiety osi.
library(ggplot2)
jobsAFAM1 <- data.frame(
data_date = runif(5,1,100),
Percent.Change = runif(5,1,100)
)
jobsAFAM2 <- data.frame(
data_date = runif(5,1,100),
Percent.Change = runif(5,1,100)
)
ggplot() +
geom_line(data = jobsAFAM1, aes(x = data_date, y = Percent.Change), color = "red") +
geom_line(data = jobsAFAM2, aes(x = data_date, y = Percent.Change), color = "blue") +
xlab('data_date') +
ylab('percent.change')
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-07-04 10:12:53
Jeśli obie ramki danych mają te same nazwy kolumn, należy dodać jedną ramkę danych w wywołaniu ggplot()
oraz podać wartości x i y w wywołaniu aes()
z wywołania ggplot()
. Następnie dodaj pierwszą geom_line()
dla pierwszej linii i dodaj drugą geom_line()
wywołanie z data=df2
(gdzie df2 jest Twoją drugą ramką danych). Jeśli chcesz mieć linie w różnych kolorach, dodaj color=
i nazwę linii eahc wewnątrz aes()
KAŻDEGO geom_line()
.
df1<-data.frame(x=1:10,y=rnorm(10))
df2<-data.frame(x=1:10,y=rnorm(10))
ggplot(df1,aes(x,y))+geom_line(aes(color="First line"))+
geom_line(data=df2,aes(color="Second line"))+
labs(color="Legend text")
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
2013-11-12 05:59:28
Wolę korzystać z biblioteki ggfortify
. Jest to owijarka ggplot2
, która rozpoznaje typ obiektu wewnątrz funkcji autoplot i wybiera najlepsze metody ggplot do wykreślenia. Przynajmniej nie muszę pamiętać składni ggplot2.
library(ggfortify)
ts1 <- 1:100
ts2 <- 1:100*0.8
autoplot(ts( cbind(ts1, ts2) , start = c(2010,5), frequency = 12 ),
facets = FALSE)
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-10-03 14:48:37
Wiem, że to stare, ale wciąż aktualne. Możesz skorzystać z reshape2:: melt, aby zmienić ramkę danych w bardziej przyjazną strukturę dla ggplot2.
Zalety:
- pozwala wykreślić dowolną liczbę linii
- każda linia o innym kolorze
- dodaje legendę dla każdej linii
- z jednym wywołaniem do ggplot / geom_line
:
- wymagany dodatkowy pakiet(reshape2)
- topienie nie jest tak intuicyjne w pierwszy
Na przykład:
jobsAFAM1 <- data.frame(
data_date = seq.Date(from = as.Date('2017-01-01'),by = 'day', length.out = 100),
Percent.Change = runif(5,1,100)
)
jobsAFAM2 <- data.frame(
data_date = seq.Date(from = as.Date('2017-01-01'),by = 'day', length.out = 100),
Percent.Change = runif(5,1,100)
)
jobsAFAM <- merge(jobsAFAM1, jobsAFAM2, by="data_date")
jobsAFAMMelted <- reshape2::melt(jobsAFAM, id.var='data_date')
ggplot(jobsAFAMMelted, aes(x=data_date, y=value, col=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-12-11 15:05:02
Alternatywą jest powiązanie ramek danych i przypisanie im typu zmiennej, którą reprezentują. To pozwoli Ci używać pełnego zestawu danych w sposób tidier
library(ggplot2)
library(dplyr)
df1 <- data.frame(dates = 1:10,Variable = rnorm(mean = 0.5,10))
df2 <- data.frame(dates = 1:10,Variable = rnorm(mean = -0.5,10))
df3 <- df1 %>%
mutate(Type = 'a') %>%
bind_rows(df2 %>%
mutate(Type = 'b'))
ggplot(df3,aes(y = Variable,x = dates,color = Type)) +
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-06-18 04:27:49