2
votes

utilisation de facteurs pour ordonner les dates de l'axe des x ggplot

Si j'ai un data.frame df

## I want the x axis to start with day.start
df = df %>% mutate(date = factor(date, levels = as.character(df$date)))

## how to change x axis to behave like dates again?
ggplot(df) + 
  geom_point(aes(x = date, y = value)) +
  geom_line(aes(x = date, y = value)) ## where is this line?

je peux tracer les valeurs en fonction des dates comme ceci

ggplot(df) + 
  geom_line(aes(x = date, y = value))

Cependant, je souhaite effectuer un ajustement pour une année personnalisée, donc je veux que l'axe des x commence à la date d'aujourd'hui.

library(lubridate)
library(ggplot2)
library(dplyr)

day.start = today()

df = data.frame(date = seq.Date(from = today() - days(10), to = today() + days(10), 'day'))
df$day.idx = as.numeric(df$date - day.start + 1)
df$day.idx = ifelse(df$day.idx < 1, df$day.idx + nrow(df), df$day.idx)
df = df %>% arrange(day.idx)            
df$value = 1:nrow(df)

Le deuxième tracé est donc plus beau, mais comment formater l'axe des x pour qu'il ressemble à nouveau aux dates (bien espacées)?

 for


1 commentaires

la fonction today () est du package lubridate , ne l'oubliez pas pour votre exemple.


4 Réponses :


0
votes

Avec votre code tel quel, je reçois le message suivant:

geom_path: chaque groupe se compose d'une seule observation. Avez-vous besoin d'ajuster l'esthétique du groupe?

Donc, ggplot ne sait pas "relier les points", c'est pourquoi le message mentionne ajuster l'esthétique du groupe . Pour lutter contre cela, j'ai attribué 1 à gorup.

df %>% 
  mutate(date = as_date(date)) %>% 
  filter(date >= today()) %>% 
  ggplot(aes(x = date, y = value)) + 
  geom_line() + 
  scale_x_date()

 entrez la description de l'image ici

Cependant, je ne le ferais pas recommande cette approche car vos dates sont alors dans le désordre, comme on peut le voir si nous ajustons votre texte sur l'axe des x:

df %>% 
  ggplot(aes(x = date, y = value, group = 1)) + 
  geom_point() +
  geom_line() + 
  theme(axis.text.x = element_text(angle = 75, hjust = 1))

 entrez la description de l'image ici a>

Modifier: Je vous recommande de conserver votre champ date en tant que date et d'utiliser filter pour ne conserver que les observations que vous souhaitez avant de rediriger vers ggplot:

ggplot(df, aes(x = date, y = value, group = 1)) + 
  geom_point() +
  geom_line()


2 commentaires

idéalement en tant que Date pour que je puisse avoir des pauses personnalisées


Je m'intéresse à tout le domaine. Le filtre supprime les observations.



0
votes

Essayez :

df[df$date > today(), ] %>% 
   mutate(date = as.Date(date)) %>% 
   ggplot(aes(x = date, y = value)) + geom_line() + geom_point()

EDIT: Une option serait d'utiliser filter plutôt que df [df $ date> today (), ] (vérifiez la réponse de @ OTStats)


0 commentaires

0
votes

Si vous voulez que l'axe des abscisses reste dans le même ordre que dans votre exemple, et que vous voulez juste qu'il soit lisible, je vous recommande de changer l'angle du texte:

ggplot(df) + 
  geom_point(aes(x = date, y = value), group = 1) +
  geom_line(aes(x = date, y = value), group = 1) +  
  theme(axis.text.x = element_text(angle = 75, hjust = 1))

p >


1 commentaires

Et si vous aviez 100 points de plus sur l'axe des x? Cela ne fonctionne que si vous en avez peu.



0
votes

J'ai trouvé une solution à partir de cette réponse: https://stackoverflow.com/a/26611593/5319229

Il s'avère que cela n'a rien à voir avec des facteurs.

Le package bdscale est arrivé pratique.

library(lubridate)
library(ggplot2)
library(dplyr)

day.start = today()

df = data.frame(date = seq.Date(from = today() - days(10), to = today() + days(10), 'day'))
df$day.idx = as.numeric(df$date - day.start + 1)
df$day.idx = ifelse(df$day.idx < 1, df$day.idx + nrow(df), df$day.idx)
df = df %>% arrange(day.idx)            
df$value = 1:nrow(df)

ggplot(df) + 
  geom_point(aes(x = date, y = value)) +
  geom_line(aes(x = date, y = value, group = 1))+
  bdscale::scale_x_bd(business.dates = df$date, labels = scales::date_format('%b %d'))


0 commentaires