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)?
4 Réponses :
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()
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))
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()
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.
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)
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 >
Et si vous aviez 100 points de plus sur l'axe des x? Cela ne fonctionne que si vous en avez peu.
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'))
la fonction
today ()
est du packagelubridate
, ne l'oubliez pas pour votre exemple.