Largeur du tracé du violon dans ggplot
J'essaie de tracer une parcelle de violon complète à côté de plusieurs parcelles de demi-violon en utilisant ggplot. Je trace l'intrigue complète du violon en utilisant geom_violin (), et je trace les parcelles du demi-violon en utilisant geom_violinhalf du paquet "see", avec scale = 'width'. Cependant, cela a produit une figure avec l'intrigue de violon complet apparaissant beaucoup plus mince que les parcelles de demi-violon, comme le montre le code ci-dessous. J'ai essayé les trois options "scale" intégrées dans ggplot.
Existe-t-il un moyen de tracer une intrigue de violon complet et plusieurs parcelles de demi-violon en utilisant une fonction? Ou y a-t-il une manière différente de régler manuellement la largeur de l'intrigue complète du violon?
Merci!
#install.packages("vioplot")
#install.packages('ggplot2')
#install.packages('scales')
library(ggplot2)
library(vioplot)
library(scales)
df1 = as.data.frame(matrix(NA, nrow = 1000, ncol = 2))
colnames(df1) = c('x','y')
df1[,2] = rnorm(1000,10,5)
df1[,1] = rep(-5, 1000)
df2 = as.data.frame(matrix(NA, nrow = 10000, ncol = 2))
colnames(df2) = c('x','y')
df2[,1] = sample(seq(0,70,5),10000,replace=TRUE)
df2[,2] = rnorm(10000,10,5)
df = rbind(df1, df2)
ggplot(df, aes(x=x,y=y))+
geom_violinhalf(data=subset(df,df$x != -5), aes(x=x, group = x), scale = 'width', fill = alpha('red', 0.2), color = alpha('red',0.2))+ geom_violin(data = subset(df, df$x== -5), color = alpha('red', 0.2), fill = alpha('red', 0.2))+
geom_point(size = 1.2, col = alpha('grey', 0.2))+
theme_classic()
ÉDITER
Le code précédent était incorrect, excuses. Comment le premier violon pourrait-il être étendu si le dataframe était plutôt comme suit, avec chacun des parcelles de violon groupé par «d» au lieu de «x»:
df1 = as.data.frame(matrix(NA, nrow = 10000, ncol = 3))
colnames(df1) = c('d','y','x')
df1[,2] = rnorm(10000,10,5)
df1[,1] = sample(seq(-5,70,.1),10000, replace=TRUE)
for(i in 1:nrow(df1)){
if(df1[i,'d'] < 0){df1[i,"x"] <- -5}else
if(df1[i,"d"] >= 0 & df1[i,"d"] < 5){df1[i,"x"] <- 0}else
if(df1[i,"d"] >= 5 & df1[i,"d"] < 10){df1[i,"x"] <- 5}else
if(df1[i,"d"] >= 10 & df1[i,"d"] < 15){df1[i,"x"] <- 10}else
if(df1[i,"d"] >=15 & df1[i,"d"] < 20){df1[i,"x"] <- 15}else
if(df1[i,"d"] >= 20 & df1[i,"d"] < 25){df1[i,"x"] <- 20}else
if(df1[i,"d"] >= 25 & df1[i,"d"] < 30){df1[i,"x"] <- 25}else
if(df1[i,"d"] >= 30 & df1[i,"d"] < 35){df1[i,"x"] <- 30}else
if(df1[i,"d"] >= 35 & df1[i,"d"] < 40){df1[i,"x"] <- 35}else
if(df1[i,"d"] >= 40 & df1[i,"d"] < 45){df1[i,"x"] <- 40}else
if(df1[i,"d"] >= 45 & df1[i,"d"] < 50){df1[i,"x"] <- 45}else
if(df1[i,"d"] >= 50 & df1[i,"d"] < 55){df1[i,"x"] <- 50}else
if(df1[i,"d"] >= 55 & df1[i,"d"] < 60){df1[i,"x"] <- 55}else
if(df1[i,"d"] >= 60 & df1[i,"d"] < 65){df1[i,"x"] <- 60}else
if(df1[i,"d"] >= 65 & df1[i,"d"] < 70){df1[i,"x"] <- 65}else
if(df1[i,"d"] >= 70 & df1[i,"d"] < 75){df1[i,"x"] <- 70}else
if(df1[i,"d"] >= 75 & df1[i,"d"] < 80){df1[i,"x"] <- 75}}
Réponses
Les largeurs s'égaliseront par défaut si vous convertissez x en un facteur:
ggplot(df, aes(x=factor(x),y=y)) +
geom_violinhalf(data=subset(df,df$x != -5), aes(group = x), scale = 'width', fill = alpha('red', 0.2), color = alpha('red',0.2)) + geom_violin(data = subset(df, df$x== -5),
color = alpha('red', 0.2), fill = alpha('red', 0.2)) +
geom_point(size = 1.2, col = alpha('grey', 0.2)) +
theme_classic()
Vous pouvez également conserver xnumérique et utiliser le widthparsmètre de geom_violin. Ici, je vais le définir un peu trop large à width = 8des fins de démonstration, mais l'idéal semble être à propos de width = 5:
ggplot(df, aes(x = x, y = y)) +
geom_violinhalf(data = subset(df,df$x != -5), aes(group = x), scale = 'width', fill = alpha('red', 0.2), color = alpha('red',0.2)) + geom_violin(data = subset(df, df$x == -5), width = 8,
color = alpha('red', 0.2), fill = alpha('red', 0.2)) +
geom_point(size = 1.2, col = alpha('grey', 0.2)) +
theme_classic()
ÉDITER
Pour ajouter les points de la colonne d, nous pouvons faire:
ggplot(df1, aes(x=x,y=y)) +
geom_violinhalf(data=subset(df1,df1$x != -5), aes(group = x), scale = 'width', fill = alpha('red', 0.2), color = alpha('red',0.2)) + geom_violin(data = subset(df1, df1$x== -5), width = 5,
color = alpha('red', 0.2), fill = alpha('red', 0.2)) +
geom_point(aes(x = d), size = 1.2, col = alpha('grey', 0.2)) +
theme_classic()