0
votes

R: Superposition de séries chronologiques

L'idée est donc simple, et je suppose que la solution se trouve quelque part, mais je ne peux tout simplement pas la trouver. J'ai 3 séries chronologiques annuelles, avec des valeurs quotidiennes, et j'aimerais pouvoir afficher les 3 années dans le même graphique, où les coordonnées x sont les mois et les coordonnées y les valeurs pour chaque année.


3 commentaires

tracé de base ou ggplot?


tout ferait! Je suppose qu'une fois que j'ai compris le concept, je peux le rechercher dans d'autres outils de traçage


Doubles: comparaison année par année de ggplot ; tracer des données avec des dates différentes ; ggplot: plusieurs années sur la même parcelle par mois ; R - Comment créer un graphique saisonnier - Différent lignes pendant des années


3 Réponses :


0
votes

dans un graphique normal, cela ressemblerait à ceci:

x11()
plot(mtcars$date, mtcars$drat, type="l")
lines(mtcars$date, mtcars$wt, col=2)
lines(mtcars$date, mtcars$gear, col=3)

bien que si vous avez une variable de temps dédiée, cela changerait comme ceci:

#x11() # opens a graphics window
plot(mtcars$drat, type="l")
lines(mtcars$wt, col=2) # permits extra lines to be added to an already existing plot
points(mtcars$gear, col=3) # permits points added to an already existing plot


2 commentaires

Ici, vous superposez simplement deux séries chronologiques avec les mêmes dates. Mon problème concerne la superposition de deux séries chronologiques relatives à des années différentes: j'ai une série 2018, 2019 et 2020, et je souhaite afficher les 3 d'entre elles sur un axe x "Jan à Dec"


Ah, je vois. Je pensais que cela fonctionnerait car il ne devrait pas y avoir de différence entre les années sauf pour les années bissextiles comme 2020. Je pense que vous seriez toujours en mesure de le faire en changeant la date dans la commande lines () / points () - j'ai pas essayé cela cependant. je pense toujours que la réponse de @Duck est bien meilleure et plus complète, donc je suis d'accord avec ça. Je voulais juste donner une réponse non ggplot car cela peut être plus rapide pour le prototypage de parcelles



3
votes

Je suggérerais une approche ggplot2 à votre examen en utilisant des données factices. Si vous voulez des mois sur l'axe des x, vous pouvez «pirater» la date en attribuant une nouvelle année afin que vous puissiez voir les mois dans l'axe après le formatage avec scale_x_date () . Vous devez également extraire les années de votre date afin d'ajouter les couleurs. Voici le code:

#Dummy data
df <- data.frame(Date=c(seq(as.Date('2017-01-01'),
                          as.Date('2017-12-31'),
                          length.out = 365),
                        seq(as.Date('2018-01-01'),
                            as.Date('2018-12-31'),
                            length.out = 365),
                        seq(as.Date('2019-01-01'),
                            as.Date('2019-12-31'),
                            length.out = 365)),
                 value = c(replicate(3, cumsum(rnorm(365)))))
#Format
#Create months and years
df %>% mutate(Year=format(Date,'%Y'),
              Date2=as.Date(paste0('2020-',format(Date,'%m-%d')))) %>%
  ggplot(aes(x=Date2,y=value,group=Year,color=Year))+
  geom_line()+
  scale_x_date(date_labels="%B",breaks = '1 month')

Sortie:

 entrez la description de l'image ici

Mise à jour: strong> Merci également au grand @AllanCameron, ici une meilleure solution utilisant cumsum () pour la variable value:

library(ggplot2)
library(dplyr)
set.seed(123)
#Dummy data
df <- data.frame(Date=c(seq(as.Date('2017-01-01'),
                          as.Date('2017-12-31'),
                          length.out = 365),
                        seq(as.Date('2018-01-01'),
                            as.Date('2018-12-31'),
                            length.out = 365),
                        seq(as.Date('2019-01-01'),
                            as.Date('2019-12-31'),
                            length.out = 365)),
                 value=rnorm(1095,5,2))
#Format
#Create months and years
df %>% mutate(Year=format(Date,'%Y'),
              Date2=as.Date(paste0('2020-',format(Date,'%m-%d')))) %>%
  ggplot(aes(x=Date2,y=value,group=Year,color=Year))+
  geom_line()+
  scale_x_date(date_labels="%B",breaks = '1 month')

Sortie:

 entrez la description de l'image ici


5 commentaires

J'aurais une approche très similaire ici Duck (+1), mais à titre d'illustration, vous obtiendriez un graphique plus agréable avec value = c (replicate (3, cumsum (rnorm (365))))


@AllanCameron Dr Cameron, vous avez raison! Je vais mettre à jour la solution avec votre suggestion utile maintenant!


Merci pour toutes ces réponses intéressantes! Nous disons donc ici qu'il n'y a pas de méthode «directe» et que nous devons créer une fausse ligne temporelle commune pour pouvoir superposer plusieurs séries chronologiques.


@PhilippeGrondier pas tout à fait. Vous pouvez utiliser la fonction yday de lubridate pour obtenir le jour de chaque année à 1: 365, puis l'utiliser comme axe des x. Pour obtenir les mois correctement étiquetés, vous feriez scale_x_continuous (breaks = c (1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335), labels = month.abb) < / code>


@PhilippeGrondier Cela dépend de vos données! Il est également possible d'extraire toutes les valeurs jour-mois à partir des dates et de les représenter en abscisse comme facteur! Comme l'a dit AllanCameron, il existe également d'autres moyens!



1
votes

Voici un exemple utilisant les données de @ Duck (avec une graine aléatoire différente) pour montrer qu'il est possible de tracer les trois séries chronologiques sans simuler les années, simplement en branchant les dates et les valeurs dans ggplot et en utilisant quelques fonctions lubridate :

ggplot(df, aes(x = lubridate::yday(Date), 
               y = value, 
               color = factor(lubridate::year(Date)))) +
geom_line() +
scale_x_continuous(
  breaks = lubridate::yday(seq(as.Date("2017-01-01"), 
                               by = "1 month", length.out = 12)), 
  labels = month.abb) +
  labs(x = "Date", colour = "Year")

 entrez la description de l'image ici


1 commentaires

Brillant. Merci!