ajouter une ligne verticale dans un boxplot sous ggplot

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

Nathalie Smits
Messages : 4
Enregistré le : 04 Juil 2006, 09:13

ajouter une ligne verticale dans un boxplot sous ggplot

Messagepar Nathalie Smits » 28 Oct 2022, 08:20

Bonjour,
Je cherche un moyen d'ajouter une ligne verticale à un graphe de type boxplot réalisé sous ggplot.
Je m'explique : j'utilise geom_bar pour tracer un boxplot qui visualise une variable numérique en fonction d'une variable catégorielle à 4 modalités.

GR6d<- ggplot(stats33, aes(x=typeparcelle, y=meanVHIrGTP, fill=typeparcelle)) +
geom_bar(stat="identity", color="black", position=position_dodge(), width=.5)

Et je souhaite ajouter sur le graphe une ligne verticale de couleur différente pour montrer qu'une des modalités est clairement différente des trois autres.
J'ai pensé utiliser vline() ou segment() mais, sauf si j'ai raté quelque chose, j'ai besoin pour cela de mentionner leur emplacement le long de l'axe des x (et des y pour segments). Or je n'ai pas de valeur à renseigner pour l'abscisse puisque cet axe est catégoriel (sauf si je peux renseigner l'abscisse sous la forme "à mi chemin entre les barres des modalités A et B" par exemple).

Il me semble que je dois pouvoir lui renseigner l'emplacement sous la forme d'un pourcentage de l'axe des x ou d'un pourcentage de la largeur de la figure, mais je ne sais pas comment faire. Quelqu'un l'a déjà fait ?

Merci!

Facundo Muñoz
Messages : 156
Enregistré le : 04 Juil 2019, 09:58
Contact :

Re: ajouter une ligne verticale dans un boxplot sous ggplot

Messagepar Facundo Muñoz » 28 Oct 2022, 08:50

Bonjour Nathalie,

Pour faciliter la compréhension du problème et pouvoir vous aider, il convient toujours de poser un exemple reproductible [1].

Ce cas là est assez simple. Mais il y a quand même des éléments confus. E.g. vous parlez de boxplot, mais faites un barplot.

Je ne vois pas comment ajouter une ligne verticale quelque part allait montrer "qu'une des modalités est différente des autres". De tant plus que normalement les barres sont elles aussi verticales.

Si vous voulez faire remarquer une des barres sur les autres, je suggère utiliser la couleur pour cela. Plutôt que pour la faire varier selon la variable catégorielle, qui est déjà bien réprésentée sur l'axe x. Inutile de faire redondance.

Un exemple :

Code : Tout sélectionner

library(tidyverse)
mtcars |>
  group_by(cyl) |>
  summarise(
    mean_mpg = mean(mpg)
  ) |>
  mutate(
    cyl = factor(cyl),
    highlight = ifelse(cyl == 4, 'yes', 'no')
  ) |>
  ggplot() +
  aes(cyl, mean_mpg, fill = highlight) +
  geom_bar(stat = 'identity', show.legend = FALSE) +
  scale_fill_manual(values = c(no = 'grey', yes = 'darkorange')) +
  labs(
    x = "Cylinders",
    y = "Mean MPG"
  ) +
  theme_minimal()


Image

[1] viewtopic.php?f=1&t=7638
ƒacu.-

Nathalie Smits
Messages : 4
Enregistré le : 04 Juil 2006, 09:13

Re: ajouter une ligne verticale dans un boxplot sous ggplot

Messagepar Nathalie Smits » 28 Oct 2022, 10:17

Merci!
Oui clairement je ne me suis pas bien expliquée. Il est difficile de mettre un exemple reproductible de ce qu'on n'arrive pas à réaliser... mais je copie ci-dessous la base (simplifiée) de mon graphe. Il s'agit bien effectivement d'un diagramme en barres.

type<- c("A", "B", "C", "D")
mesure <- c(2.4, 7.26, 5.8, 6.45)
stats <- data_frame(type,mesure)
essai<- ggplot(stats, aes(x=type, y=mesure, fill=type)) +
geom_bar(stat="identity", color="black", position=position_dodge(), width=.5) +
scale_fill_manual (values = c("#FFFFFF", "#FFFFCC", "#00CC66", "#006633"))

Ce que je souhaite faire d'ajouter une ligne, un trait vertical (rouge probablement) en plus des barres représentant les données que je souhaite, elles, laisser intactes. Ce repère, serait inséré entre les barres "A" et "B" pour souligner que A est nettement différent de B, C et D, que cela forme en quelque sorte deux groupes. Pour l'instant, je le fais en rajoutant ce trait et son commentaire a posteriori sur l'image obtenue par ggsave, mais j'aimerais pouvoir l'automatiser dans R car j'ai plusieurs graphes du même type à réaliser.
D'ailleurs je pense que ma question pourrait se poser de la même manière pour définir la place d'une annotation, d'une flèche, etc : "normalement" pour rajouter un élément par-dessus un graphe, on donne les valeurs de x et y pour positionner ce genre d'éléments. Comment fait-on quand x n'est pas numérique ? J'avais pensé rajouter un graphe vide superposé au mien dans une autre couche mais avec un axe des x numérique, et tracer mon repère rouge dedans en utilisant les coordonnées de ce deuxième graphe, mais je ne sait pas trop comment on peut s'y prendre.

J'espère que ces précisions rendront ma question plus claire et vous remercie encore de votre contribution!

Nathalie

Facundo Muñoz
Messages : 156
Enregistré le : 04 Juil 2019, 09:58
Contact :

Re: ajouter une ligne verticale dans un boxplot sous ggplot

Messagepar Facundo Muñoz » 28 Oct 2022, 10:28

Je comprends.

Vous pouvez utiliser une échelle numérique où les positions des catégories sont les entiers.
Ainsi, pour insérer une ligne verticale entre A et B vous pouvez ajouter ceci à votre code.

Code : Tout sélectionner

  geom_vline(
    xintercept = 1.5,
    colour = "red"
  )


Vous pouvez faire pareil avec des segments ou tout autre type d'annotations.

Ceci dit, d'un point de vu de communication, je privilégierais l'utilisation des couleurs ou des panneaux (facets) pour distinguer la barre A des autres. Mais c'était pas votre question ;).

Cordialement,
ƒacu.-

Nathalie Smits
Messages : 4
Enregistré le : 04 Juil 2006, 09:13

Re: ajouter une ligne verticale dans un boxplot sous ggplot

Messagepar Nathalie Smits » 28 Oct 2022, 12:47

Ah oui je comprends, je n'avais effectivement pas pensé à changer la nature de l'axe des abscisses. Il me suffira ensuite de forcer l'utilisation des noms de catégorie pour les labels de mon axe.

Et ... par ailleurs, mes barres sont déjà colorées, suivant un code couleur que nous utilisons déjà sur d'autres communication et qu'il nous faut garder. Le but est de faire apparaître un repère sur les graphes ou "A" se distingue en laissant les autres graphes sans rien.

Merci de votre aide!!

Nathalie


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron