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. P >
3 Réponses :
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
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
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:
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:
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!
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")
Brillant. Merci!
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