Larghezza trama violino in ggplot

Oct 03 2020

Sto cercando di tracciare una trama completa di violino accanto a più trame di mezzo violino usando ggplot. Sto tracciando l'intera trama del violino usando geom_violin () e tracciando la trama del mezzo violino usando geom_violinhalf dal pacchetto "see", con scale = 'width'. Tuttavia, questo ha prodotto una figura con l'intera trama del violino che appare significativamente più sottile rispetto alle trame del mezzo violino, come si vede nel codice sottostante. Ho provato le tre opzioni di "ridimensionamento" integrate in ggplot.

Esiste un modo per tracciare un complotto completo di violino e più trame di mezzo violino utilizzando una funzione? O c'è un modo diverso in cui posso impostare manualmente la larghezza dell'intera trama del violino?

Grazie!

#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()

MODIFICARE

Il codice precedente non era corretto, ci scusiamo. Come potrebbe essere espanso il primo violino se il dataframe fosse invece il seguente, con ciascuna delle trame del violino raggruppata per "d" invece che per "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}}

Risposte

3 AllanCameron Oct 03 2020 at 01:36

Le larghezze verranno equalizzate per impostazione predefinita se converti x in un fattore:

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

In alternativa, puoi mantenere un valore xnumerico e utilizzare il widthparametro di geom_violin. Qui lo imposterò un po 'troppo largo a width = 8scopo dimostrativo, ma l'ideale sembra essere 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()


MODIFICARE

Per aggiungere i punti dalla colonna d, possiamo fare:

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