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.

Author: Patthebug, 2013-11-12

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')
 77
Author: TheComeOnMan,
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")

Tutaj wpisz opis obrazka

 36
Author: Didzis Elferts,
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)

Wykreśl

 5
Author: Marcelo Ruas,
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()

Tutaj wpisz opis obrazka

 2
Author: Chris Njuguna,
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()
 0
Author: JLoria,
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