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())
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"))
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.