3 votes

Mauvaise position des barres d'erreur esquivées lorsque aes(group = ...) mais pas aes(fill/shape = ...)

Tracer les barres d'erreur avec position = "dodge" m'a causé de nombreux maux de tête ces derniers temps... Curieusement, les esquiver avec l'esthétique shape o fill (qui ne devraient pas s'appliquer aux barres d'erreur) semblent bien fonctionner. Cependant, l'esquive avec l'esthétique group place les barres dans des positions inattendues. Je me demandais si ce n'était pas un bug de ggplot2.

J'aime placer des barres d'erreur personnalisées derrière les diagrammes à barres ou les boxplots. Parfois, je donne des couleurs spéciales à différents éléments de mes graphiques. Pour cette raison, j'inclus souvent aes() pas dans le ggplot() mais dans les géoms ou les stats.

Voici un exemple de barres d'erreur "bien placées" :

library(ggplot2)
library(dplyr)

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge") + 
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0) 

Plot1

Cela produit l'avertissement Warning: Ignoring unknown aesthetics: fill . Utilisation de aes(shape = supp) imprime le même graphique.

Je m'attendrais à ce que le même tracé, mais aucun avertissement en échangeant le remplissage/la forme avec "groupe" ( aes(group = supp) ). Cela ne produit aucun avertissement, mais un résultat très inattendu :

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge") + 
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)  

Plot2

Quelqu'un aurait-il une explication pour ce comportement ? Ne devrait-on pas regrouper avec aes(group = ...) y aes(fill = ...) se comportent-ils de la même manière sur la position d'esquive ?

1voto

MYaseen208 Points 3379

Le code ignore l'esthétique inconnue : fill

stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge") 

Alors que le code considère l'esthétique group = supp et donne deux barres d'erreur chacune pour JO y VC .

stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge")

Code complet

library(ggplot2)
library(dplyr)

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge") +
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0) 

Warning: Ignoring unknown aesthetics: fill

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge") + 
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)

1voto

Z.Lin Points 9668

Desde ?aes_group_order (accentuation ajoutée) :

Par défaut, le groupe est fixé à l'interaction de tous les discrets variables discrètes dans le graphique . Cette méthode permet souvent de répartir correctement les données, mais quand ce n'est pas le cas, ou quand aucune variable discrète n'est utilisée dans le tracé, vous devrez définir explicitement la structure de groupement, en associant le groupe à une variable ayant une valeur différente pour chaque groupe. groupe à une variable qui a une valeur différente pour chaque groupe.

Avec

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge")

Le groupe pour les barres d'erreur est automatiquement fixé à l'interaction entre la dose (qui a été convertie en facteur, c'est-à-dire en variable discrète) et le supp (qui est déjà un facteur dans l'ensemble de données ToothGrowth). En d'autres termes, chaque combinaison de dose c(0.5, 1, 1.5) et supp c("OJ", "VJ") est traité comme un groupe distinct dans le but de calculer les statistiques sommaires des boxplots. Par conséquent, les barres d'erreur affichées correspondent parfaitement à la couche du boxplot, même si le remplissage n'est pas un critère esthétique pertinent pour les statistiques de synthèse. geom_errorbar .

Avec

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge")

Le groupe pour les barres d'erreur est explicitement défini comme étant supp et uniquement supp. Cela remplace le comportement par défaut, donc au lieu de 6 groupes comme ci-dessus, nous n'en avons que deux (un pour "OJ" et un pour "VJ"). Cela entraîne un décalage entre la couche des barres d'erreur et la couche des boxplots.

Vous pouvez définir explicitement le mappage de groupe pour imiter le comportement par défaut :

p1 <- ToothGrowth %>%
  mutate(dose = factor(dose)) %>%
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = interaction(dose, supp)), geom = "errorbar", position = "dodge") +
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)
p1
layer_data(p1, 1L) # view data associated with error bar layer
layer_data(p1, 2L) # view data associated with boxplot layer

p2 <- ToothGrowth %>%
  mutate(dose = factor(dose)) %>%
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = interaction(supp, dose)), geom = "errorbar", position = "dodge")+
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)
p2
layer_data(p2, 1L) # view data associated with error bar layer
layer_data(p2, 2L) # view data associated with boxplot layer

Nota: interaction(dose, supp) y interaction(supp, dose) donnera le même tracé, en termes d'apparence, mais si vous voulez comparer les données sous-jacentes associées à chaque couche, interaction(dose, supp) génère des groupes dans le même ordre que la valeur par défaut, tandis que interaction(supp, dose) ne le fait pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X