web-dev-qa-db-fra.com

Tracer plusieurs séries chronologiques sur le même graphique à l'aide de ggplot ()

Je suis assez nouveau pour R et tente de tracer simultanément deux lignes de série temporelle (en utilisant des couleurs différentes, bien sûr) en utilisant ggplot2. 

J'ai 2 cadres de données. la première contient les colonnes "Changement en pourcentage pour X" et "Date". La seconde contient également les colonnes «Changement en pourcentage pour Y» et «Date», c’est-à-dire qu’elles ont toutes les deux une colonne «Date» avec les mêmes valeurs, tandis que les colonnes «Changement en pourcentage» ont des valeurs différentes. 

Je voudrais tracer les colonnes "Changement en pourcentage" par rapport à "Date" (commune aux deux) en utilisant ggplot2 sur un même tracé. 

Les exemples que j'ai trouvés en ligne utilisaient le même cadre de données avec différentes variables pour y parvenir. Je n'ai pas été en mesure de trouver quoi que ce soit qui utilise deux cadres de données pour obtenir l'intrigue. Je ne veux pas lier les deux trames de données, je veux les garder séparées. Voici le code que j'utilise:

ggplot(jobsAFAM, aes(x=jobsAFAM$data_date, y=jobsAFAM$Percent.Change)) + geom_line() +
  xlab("") + ylab("")

Mais ce code ne produit qu'une ligne et je voudrais ajouter une autre ligne dessus . Toute aide serait très appréciée . TIA.

34
Patthebug

ggplot vous permet d’avoir plusieurs couches, et c’est ce dont vous devriez tirer avantage ici.

Dans le graphique créé ci-dessous, vous pouvez constater que deux instructions geom_line touchent chacun de vos ensembles de données et les tracent ensemble sur un graphique. Vous pouvez étendre cette logique si vous souhaitez ajouter un autre jeu de données, un tracé ou même des fonctionnalités du graphique telles que les étiquettes d'axe.

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')
81
TheComeOnMan

Si les deux cadres de données ont les mêmes noms de colonne, vous devez ajouter un cadre de données dans l'appel ggplot() et nommer les valeurs x et y dans l'appel aes() de ggplot(). Ajoutez ensuite la première geom_line() pour la première ligne et le deuxième appel geom_line() avec data=df2 (où df2 est votre deuxième trame de données). Si vous avez besoin de lignes de couleurs différentes, ajoutez color= et le nom de chaque ligne dans aes() de chaque 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")

enter image description here

37
Didzis Elferts

Je préfère utiliser la bibliothèque ggfortify. C'est un wrapper ggplot2 qui reconnaît le type d'objet dans la fonction autoplot et choisit les meilleures méthodes de ggplot à tracer. Au moins, je n'ai pas à me souvenir de la syntaxe de ggplot2.

library(ggfortify)
ts1 <- 1:100
ts2 <- 1:100*0.8
autoplot(ts( cbind(ts1, ts2)  , start = c(2010,5), frequency = 12 ),
         facets = FALSE)

Plot

5
Marcelo Ruas

Je sais que c'est vieux mais c'est toujours pertinent. Vous pouvez tirer parti de reshape2 :: melt pour changer le cadre de données en une structure plus conviviale pour ggplot2. 

Avantages:

  • vous permet de tracer un nombre quelconque de lignes
  • chaque ligne avec une couleur différente
  • ajoute une légende pour chaque ligne
  • avec un seul appel à ggplot/geom_line

Désavantage:

  • un paquet supplémentaire (reshape2) requis
  • la fusion n'est pas si intuitive au début

Par exemple:

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

 enter image description here

2
Chris Njuguna

Une alternative consiste à lier les images et à leur attribuer le type de variable qu’elles représentent. Cela vous permettra d'utiliser l'ensemble de données complet d'une manière plus ordonnée

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
JLoria