GGPLOT2, Barplot et gestion des dates en abscisse.

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Brice Roggy
Messages : 3
Enregistré le : 29 Déc 2021, 15:50

GGPLOT2, Barplot et gestion des dates en abscisse.

Messagepar Brice Roggy » 30 Déc 2021, 17:32

Bonjour,
Je réalise chaque année un certain nombre de graphiques sous excel de ce type :
Image
Il s'agit simplement de rendre compte des résultats de comptages d'oiseaux hebdomadaires, réalisés d'octobre à mars.

Je souhaiterais préparer un script avec R qui me permettrait chaque année de réaliser l'ensemble de mes graphiques beaucoup plus rapidement qu'avec Excel tout en conservant le plus possible le visuel d'origine (image ci-dessus)
Pour cela j'ai importé ma base de données sur R et ai réalisé un premier graphique avec ggplot2 (d'abord à l'aide de l'Addins Esquisse puis complété le script "à la main").

Code : Tout sélectionner

X2019_3 %>%
  filter(ESPECE %in% "Sarcelle_d-hiver") %>%
  ggplot() +
  aes(x = Date, weight = NbT) +
  geom_bar(fill = "#44546A") +
  labs(y = "", x = "",title = "Sarcelle d'hiver") +
  theme_minimal() +
  theme(plot.title = element_text(color="#383838",size = 16L, face = "bold", hjust = 0.5), plot.subtitle = element_text(hjust = 0.5),
        axis.text.x = element_text(angle=90, hjust=0, vjust=0), axis.line = element_line(colour = "grey"), axis.ticks = element_line(colour = "grey") , panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())

Image Image

Le résultat me convient plutôt bien à l’exception de l'affichage des dates en abscisse. Je souhaiterais me rapprocher du graphique d'origine et à minima que soit affiché sous chaque barre la date du comptage correspondante (ou simplement délimiter chaque mois). J'ai passé une bonne partie de la journée d'hier a essayer pas mal de choses mais sans succès. j'ai notamment utilisé la fonction ## scale_x_date(date_labels = ("%m-%y"), date_breaks = ("1 month") ## en changeant les paramètres un certain nombre de fois, mais les dates sont toujours décalées par rapport aux barres.

Merci d'avance pour votre aide,
Brice

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: GGPLOT2, Barplot et gestion des dates en abscisse.

Messagepar Mickael Canouil » 30 Déc 2021, 19:52

Bonjour,

les graduations des dates se font à l'origine, c'est donc normal que le mois apparaisse au début du mois.
Il existe plusieurs possibilités pour atteindre un résultat proche, cependant il va vous falloir fournir un exemple minimal reproductible.

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Brice Roggy
Messages : 3
Enregistré le : 29 Déc 2021, 15:50

Re: GGPLOT2, Barplot et gestion des dates en abscisse.

Messagepar Brice Roggy » 03 Jan 2022, 08:47

Bonjour,
Merci pour votre réponse.

Vous trouverez via ce lien google drive mon jeu de données : https://drive.google.com/file/d/1_X9wmt-ZLtLtT6EuYQq7ZuzvMDeAZp6Z/view?usp=sharing

Et le code reproductible :

Code : Tout sélectionner

library(readr)
X2019_3 <- read_delim("2019-3.csv", delim = ";",
                      escape_double = FALSE, col_types = cols(Date = col_date(format = "%d/%m/%Y")),
                      trim_ws = TRUE)
attach(X2019_3)
library(dplyr)
library(ggplot2)
X2019_3 %>%
  filter(ESPECE %in% "Sarcelle_d-hiver") %>%
  ggplot() +
  aes(x = Date, weight = NbT) +
  geom_bar(fill = "#44546A") +
  labs(y = "", x = "",title = "Sarcelle d'hiver") +
  theme_minimal() +
  theme(plot.title = element_text(color="#383838",size = 16L, face = "bold", hjust = 0.5), plot.subtitle = element_text(hjust = 0.5),
        axis.text.x = element_text(angle=90, hjust=0, vjust=0), axis.line = element_line(colour = "grey"), axis.ticks = element_line(colour = "grey") , panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())


J'ai préféré vous transmettre directement mon jeu de données plutôt que d'en insérer une version réduite qui aurait été de mon point de vue peu représentative. Dites moi si cela vous convient.

Merci d'avance,
Bien cordialement,
Brice

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: GGPLOT2, Barplot et gestion des dates en abscisse.

Messagepar Mickael Canouil » 05 Jan 2022, 19:53

Personnellement, je ne télécharge pas des fichiers de source inconnue.
Ici un extrait me semble largement suffisant même si ça ne contient que deux mois avec deux semaines et que pour "Sarcelle_d-hiver" par exemple.
Mickaël
mickael.canouil.fr | rlille.fr

Brice Roggy
Messages : 3
Enregistré le : 29 Déc 2021, 15:50

Re: GGPLOT2, Barplot et gestion des dates en abscisse.

Messagepar Brice Roggy » 06 Jan 2022, 09:44

Bonjour,

Pas de soucis, après quelques difficultés (je débute sur R) voici un data.frame similaire à ma BDD avec le même problème dans mon graphique :

Le data.frame :

Code : Tout sélectionner

  Date   Espece  NB
1  2019-10-04 Sarcelle 152
2  2019-10-25  Chipeau 500
3  2019-10-10 Sarcelle  80
4  2020-01-17 Sarcelle  65
5  2020-02-14 Sarcelle   5
6  2020-02-28 Sarcelle   3
7  2020-03-06 Sarcelle  60
8  2020-03-13 Sarcelle 128
9  2020-03-20 Sarcelle 175
10 2020-03-27 Sarcelle 200

Contenu du data.frame :

Code : Tout sélectionner

df <- structure(list(Date = structure(c(18173, 18194, 18179, 18278,18306, 18320, 18327, 18334, 18341, 18348),class = "Date"),
                     Espece = c("Sarcelle", "Chipeau", "Sarcelle", "Sarcelle", "Sarcelle", "Sarcelle", "Sarcelle", "Sarcelle", "Sarcelle", "Sarcelle"),
                     NB = c(152, 500, 80, 65,5, 3, 60, 128, 175, 200)), class = "data.frame", row.names = c(NA,-10L))

Graphique :

Code : Tout sélectionner

library(dplyr)
library(ggplot2)
df %>%
  filter(Espece %in% "Sarcelle") %>%
  ggplot() +
  aes(x = Date, weight = NB) +
  geom_bar(fill = "#112446") +
  theme_minimal()


Pour être au plus proche de ma BDD j'ai volontairement inséré une date où la Sarcelle n'a pas été observée, mais une autre espèce oui.

J'espère que cela va convenir,
Bien cordialement,
Brice

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: GGPLOT2, Barplot et gestion des dates en abscisse.

Messagepar Mickael Canouil » 08 Jan 2022, 17:18

Le plus simple, est de rester dans le format "date", mais cela ne donne pas exactement le même résultat.

Code : Tout sélectionner

df <- structure(list(Date = structure(c(18173, 18179, 18278, 18306, 
18320
, 18327, 18334, 18341, 18348), class = "Date"), Espece = c("Sarcelle", 
"Sarcelle", "Sarcelle", "Sarcelle", "Sarcelle", "Sarcelle", "Sarcelle", 
"Sarcelle", "Sarcelle"), NB = c(152, 80, 65, 5, 3, 60, 128, 175, 
200
)), class = "data.frame", row.names = c(NA, -9L))
library(ggplot2)
ggplot(df) +
  aes(= Date, weight = NB) +
  geom_bar(fill = "#112446", width = 1) +
  theme_minimal() +
  scale_x_date(
    date_breaks = "month",
    date_minor_breaks = "week",
    date_labels = "%B",
    sec.axis = dup_axis(
      name = NULL,
      labels = scales::date_format("%W"),
      breaks = scales::date_breaks("week")
    )
  )

Image

Si on veut "centrer" les mois, il faut alors passer en facteur et définir soi-même les graduations et leurs étiquettes.
C'est ce que j'ai fait dans le code suivant : https://github.com/mcanouil/imdb-rating ... #L314-L433
Qui génère la figure suivante :
Image

Possible de faire la ligne verticale avec geom_vline (possible aussi de le faire dépendre de "data" fourni dans le ggplot, en défissant une fonction qu'on passera à l'argument data de feom_vline (pareil pour les annotations d'années avec geom_text)

Code : Tout sélectionner

geom_vline(
    
xintercept = as.Date(
      
sprintf("%s-01-01"unique(lubridate::year(df[["Date"]])))
    ),
    
colour "black"
  
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité

cron