4 votes

Problèmes de légende de geom_violin + geom_boxplot R

Je me trouve dans une situation probablement rare où j'ai des valeurs pour plusieurs groupes que je voudrais tracer à l'aide de R 's ggplot2 's geom_violin + geom_boxplot remplir et colorier les violons par groupe, et colorier les boîtes par groupe également. Parfois, un ou plusieurs groupes ont moins de trois valeurs, par exemple :

set.seed(1)

df <- data.frame(group = c(rep("A",100),rep("B",100),rep("C",2),"D"),
                 value = c(rnorm(100,1,1), rnorm(100,2,1), rnorm(2,3,1), rnorm(1,1,1)))

Mon ggplot2 Le code est :

library(ggplot2)
ggplot(df,aes(x=group,y=value)) + 
  geom_violin(aes(fill=group,color=group),alpha=0.3) +
  geom_boxplot(width=0.1,aes(color=group),fill=NA) +
  theme_minimal() + ylab("Value") + theme(legend.title=element_blank(),axis.ticks.x=element_blank(),axis.text.x=element_blank(),axis.title.x=element_blank())

Où pour cet exemple donne : enter image description here

Le comportement indésirable est que la légende est divisée en deux, où j'imagine que cela se produit parce que les groupes C et D ne peuvent pas être représentés par des violons en raison du nombre insuffisant de points.

En augmentant le nombre de points des groupes C et D à 3, on obtient le comportement souhaité avec le même code :

set.seed(1)

df <- data.frame(group = c(rep("A",100),rep("B",100),rep("C",3),rep("D",3)),
                 value = c(rnorm(100,1,1), rnorm(100,2,1), rnorm(3,3,1), rnorm(3,1,1)))

df$group <- factor(df$group, levels = c("A","B","C","D"))

enter image description here

Ma question est de savoir s'il est possible de forcer mon ggplot2 pour toujours donner une seule légende, comme dans le deuxième exemple, même si le nombre de points d'un groupe est de un.

Je sais que je peux gonfler artificiellement ces groupes en ajoutant des pseudo-comptes pour eux, mais je préfère rester fidèle aux données dans ce cas.

4voto

Allan Cameron Points 56117

Vous pouvez simplement spécifier limits pour inclure tous les niveaux :

library(ggplot2)

ggplot(df, aes(x = group, y = value)) + 
  geom_violin( aes(color = group,  fill = group), alpha = 0.3) +
  geom_boxplot(aes(color = group), fill = NA, width = 0.1) +
  scale_fill_manual(limits = c("A", "B", "C", "D"),
                    values = scales::hue_pal()(4),
                    drop   = FALSE) +
  ylab("Value") + 
  theme_minimal() + 
  theme(legend.title = element_blank(),
        axis.ticks.x = element_blank(),
        axis.text.x  = element_blank(),
        axis.title.x = element_blank())

enter image description here

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