Fecha de la ultima revisión

## [1] "2024-04-15"

library(gridExtra)# Para organizar múltiples gráficos juntos
library(tidyverse)
library(ggversa)

Diagrama de violín con geom_violin

El gráfico de violín es similar al gráfico de caja, pero la caja es curvada para dar una apreciación de la densidad de los datos. Si la distribución de los datos sigue una curva normal, saldrá entonces como una curva de campana orientada verticalmente. Para los ejemplos a continuación, utilizaremos los datos de la orquídea terestre australiana Caladenia valida.

El modelo básico del gráfico de violín se muestra en la Figura, Note que, tal como ocurre con geom_boxplot, si se tiene solamente un grupo, se tiene que incluir x=1. Lo que uno observa es que la mayoria de la información encuentre cerca del valor 5 y 10

library(ggplot2)
CalVal=caladeniavalida 
violinplot1 <- ggplot(CalVal, aes(DCL, x=1))
violinplot1 +
  geom_violin()+
  annotate("text", x= 0.75,y= 19, size=8,
           label="", na.rm=TRUE)+
  theme(axis.title=element_text(size=10,face="bold"))+
  ylab("EL largo del apendizaje dorsal")


Geom_violin con múltiples grupos

A continuación vamos a producir el gráfico de violín por diferentes factores o grupos de acuerdo al año, a la vez que se le añade color azul a los violines y se le cambia la intensidad al color con alpha=().

violinplot2 <- ggplot(CalVal, aes(y=LCL, x=factor(Year)))
violinplot2 +
  geom_violin(fill="blue", alpha=0.5)+
  annotate("text", x=2,y= 19, size=8,
           label="", na.rm=TRUE)+
  labs(x="Año", y="LCL")+
  theme(axis.title=element_text(size=10,face="bold"))+
  ylab("EL largo del apendizaje lateral")


El gráfico de violín con datos distribución normal

normal_data=rnorm(1000, 0, 4)
#normal_data
dfnorm=data.frame(normal_data)
head(dfnorm)
##   normal_data
## 1   0.1935699
## 2   5.0240626
## 3  -4.4411186
## 4  -4.0317404
## 5  -5.5985502
## 6  -1.6595799
library(ggplot2)
ggplot(dfnorm,aes(normal_data, x=1))+
  geom_violin()+
  geom_boxplot()+
geom_jitter(position = position_jitter(width = .1))

Geom_violin utilizado con geom_point y geom_jitter

Al gráfico anterior se le pueden añadir los datos para visualizar mejor la distribución. Los datos de altura de la planta OH fueron recolectado de forma discreta en unidades de 5 cm, por lo que todos los valores similares aparecerán solapados unos sobre otros. Debido a esta situación particular de ese tipo de datos, añadirle puntos para visualizarlos con la función geom_point realmente no ayuda mucho a entender su distribución. Esto es debido a que no se puede apreciar la cantidad de datos utilizados para construir los violines. Por otro lado, uno puedo utilizar geom_jitter y tener una mejor apreciación de su distribución.

Es importante tomar en consideración que si se le añade geom_point antes de geom_violin, los puntos podrían quedar escondidos detrás del violín.

violingp=violinplot3a <- ggplot(CalVal, aes(y=OH, x=factor(Year)))+
  geom_violin()+
  geom_point()+  # Note que los puntos serán sobrepuestos sobre el violín 
  annotate("text", x=2,y= 20, size=8,
           label="", na.rm=TRUE)+
  labs(x="Año", y="OH")+
  theme(axis.title=element_text(size=10,face="bold"))



violingv=violinplot3a +
  geom_violin()+
  geom_jitter(position = position_jitter(width = .1))+ # Note que los puntos serán sobrepuestos sobre el violín pero no solapan uno encima del otro.    
  annotate("text", x=2,y= 20, size=8,
           label="", na.rm=TRUE)+
  labs(x="Año", y="OH")+
  theme(axis.title=element_text(size=10,face="bold"))+
  xlab("Overall height, mm")

grid.arrange(violingp, violingv, ncol=2)


geom_jitter y solapamiento de geom

En el próximo gráfico, se invocó geom_jitter antes que geom_violin, pero a la misma vez se le cambió la intensidad del color para que se vean mejor los puntos. Vemos que algunos de los puntos que antes están medio escondidos y los que no solapan el violin se revelan sobre mejor.

violinplot3 <- ggplot(CalVal, aes(y=OH, x=factor(Year)))
violinplot3 +
  geom_jitter(position = position_jitter(width = .2), colour="red")+
  geom_violin(fill="yellow", colour="blue", alpha=0.3)+
  annotate("text", x=2,y= 20, size=8,
           label="")+
  labs(x="Año", y="OH")+
  theme(axis.title=element_text(size=10,face="bold"))


Los cuartiles y geom_violin

Ahora se muestran el cuartil 25, la mediana (50) y el cuartil 75 en el mismo gráfico de violín con líneas horizontales.

violinplot3 <- ggplot(CalVal, aes(y=OH, x=factor(Year)))
violinplot3 +
  geom_violin(draw_quantiles = c(0.025, 0.25,0.5, 0.75,0.975))+
  annotate("text", x=2,y= 20, size=8,
           label="")+
  labs(x="Año", y="OH")+
  theme(axis.title=element_text(size=10,face="bold"))


Añadiendo color al contorno del violin

En esta figura se le añade color al contorno de los violines y las líneas de los cuartiles.

library(ggversa)
names(caladeniavalida)
##  [1] "Population" "Year"       "Plant_num"  "OH"         "OD"        
##  [6] "OW"         "DSL"        "DCL"        "LSL"        "LCL"       
## [11] "LSW"        "PL"         "LL"         "LW"         "Fruit_not"
violinplot3 <- ggplot(CalVal, aes(y=OH, x=Population))
violinplot3 +
  geom_violin(colour="red", alpha=.2, draw_quantiles = c(0.25, 0.5, 0.75))+
  annotate("text", x=2,y= 20, size=8,
           label="")+
  labs(x="Año", y="OH")+
  theme(axis.title=element_text(size=10,face="bold"))


Geom_violin por categoría o factor

En la Figura se cambia el color de cada grupo, Year. Para lograr ese efecto se le añade otra variable para representar los grupos (o categorías) por color; en este caso, la distribución de los tamaños de las plantas en términos de si produjeron frutos o no.

violinplot3 <- ggplot(na.omit(CalVal), aes(y=OH, x=factor(Year)))
violinplot3 +
  geom_violin(aes(fill=(factor(Fruit_not))),
              draw_quantiles = c(0.25, 0.5, 0.75))+
  annotate("text", x=2,y= 20, size=8,
           label="")+
  labs(x="Año", y="OH")+
  theme(axis.title=element_text(size=10,face="bold"))+
  ylab("Altura de la planta")


Geom_violin en proporción al tamaño de la muestra

En la Figura se modifica el mismo gráfico para que tome en consideración el tamaño de muestra utilizando la opción de scale con el parámetro count. En otras palabras, los violines van a quedar modificados para incluir el tamaño de la muestra; o sea, la escala máxima del ancho es proporcional al tamaño de la muestra. Entonces, en este caso vemos el año donde hubo mayor (2007) y menor (2008) tamaño de muestra de acuerdo al ancho que se muestra para cada violín.

violinplot3 <- ggplot(CalVal, aes(y=OH, x=factor(Year)))
violinplot3 +
  geom_violin(scale = "count",
              draw_quantiles = c(0.25, 0.5, 0.75))+
  labs(x="Año", y="OH")+
  theme(axis.title=element_text(size=10,face="bold"))


Geom_violin no en proporción al tamaño de la muestra

En la Figura se modifica el ancho del violín a 1 en la escala del eje de X. En otras palabras, en este caso el ancho width del violín para el primer año va de 2003.5 al 2004.5, para el segundo violín de 2004.5 a 2005.5 y así sucesivamente en forma consecutiva para los demás años. Este enfoque crea una grado de uniformidad para cada ancho. En este caso el ancho no esta relacionado con el tamaño de muestra como el ejemplo anterior.

violinplot3 <- ggplot(CalVal, aes(y=OH, x=factor(Year)))
violinplot3 +
  geom_violin(scale = "width",
              draw_quantiles = c(0.25, 0.5, 0.75))+
  labs(x="Año", y="OH")+
  theme(axis.title=element_text(size=10,face="bold"))


Geom_violin y el cambio de orientación

En la Figura cambiamos la orientación de los gráficos anteriores utilizando la opción coord_flip().

violinplot3 <- ggplot(CalVal, aes(y=OH, x=factor(Year)))
violinplot3 +
  geom_violin()+
  coord_flip()+
  labs(x="Año")+
  theme(axis.title=element_text(size=10,face="bold"))+
  ylab("Altura de la planta")


Gráficos de Densidad con colores para los diferentes cuantiles

library(data.table)
dt <- data.table(x=c(1:200),y=rnorm(200)) # Crear un distribucion de 200 datos al azar con una distribución normal
dens <- density(dt$y) # calcular la densidad
df <- data.frame(x=dens$x, y=dens$y) # crear un data frame de la densidad
probs <- c(0.1, 0.25, 0.5, 0.75, 0.9) # determinar cual cuantil quiere evaluar
quantiles <- quantile(dt$y, prob=probs) # asignar cada valor a uno de los cuantiles
df$quant <- factor(findInterval(df$x,quantiles)) # Asignar los cuantiles a factores


ggplot(df, aes(x,y)) + geom_line() +
  geom_ribbon(aes(ymin=0, ymax=y, fill=quant)) + 
  scale_x_continuous(breaks=quantiles) + 
  scale_fill_brewer(guide="none")

CalVal2=
  CalVal %>% select(OH) %>% 
  drop_na()    # Seleccionar lo datos deseados removiendo los "NA"

dens2=density(CalVal2$OH) 
dens2
## 
## Call:
##  density.default(x = CalVal2$OH)
## 
## Data: CalVal2$OH (163 obs.); Bandwidth 'bw' = 2.94
## 
##        x               y            
##  Min.   :16.18   Min.   :0.0000094  
##  1st Qu.:34.34   1st Qu.:0.0008163  
##  Median :52.50   Median :0.0050413  
##  Mean   :52.50   Mean   :0.0137526  
##  3rd Qu.:70.66   3rd Qu.:0.0262349  
##  Max.   :88.82   Max.   :0.0566222
df2 <- data.frame(x=dens2$x, y=dens2$y)
head(df2)
##          x            y
## 1 16.17920 9.649217e-06
## 2 16.32136 1.115009e-05
## 3 16.46352 1.283130e-05
## 4 16.60567 1.481782e-05
## 5 16.74783 1.704836e-05
## 6 16.88998 1.953867e-05
probs <- c(0.01, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, .99)
quantiles <- quantile(CalVal2$OH, prob=probs)
df2 <- data.frame(x=dens2$x, y=dens2$y)
df2$quant <- factor(findInterval(df2$x,quantiles))
head(df2)
##          x            y quant
## 1 16.17920 9.649217e-06     0
## 2 16.32136 1.115009e-05     0
## 3 16.46352 1.283130e-05     0
## 4 16.60567 1.481782e-05     0
## 5 16.74783 1.704836e-05     0
## 6 16.88998 1.953867e-05     0
ggplot(df2, aes(x,y)) +  
  geom_ribbon(aes(ymin=0, ymax=y, fill=quant)) + 
  scale_x_continuous(breaks=quantiles) + 
  scale_fill_brewer(palette = "Set1",guide="none")+  # colores horribles
  theme(axis.text.x = element_text(angle = 45))


  1. Preparar un gráfico de violín. Utiliza los datos CypripediumA en el paquete ggversa. Utiliza la columna Lip_length_mm, que es el largo de labelo de la orquidea Cypripedium acaule. La especies de orquídea vive en el norte de Canada en bosques cerados (Forest) o pantanos (Wetlands). Utiliza la columna Forest_Wetland para crear una caja de violín por cada sitio de muestreo. Poner color a los dos grupos. Evaluando la distribución de los datos sobre el tamaño del labello, Ud. cree que la distribución de tamaño es igual?
    • Salva el gráfico en formato .png y subirla a MSteam
Las fotos son de Dr. Peter Nosko de University of Nipissing, North Bay, Canada

Las fotos son de Dr. Peter Nosko de University of Nipissing, North Bay, Canada


Opciones y Parametros de geom_violin:

  • ggplot(el archivo de datos, aes(la variable continua, x=1)): {x=1} si es un grupo o el nombre de la variable discreta si hay múltiples grupos

  • geom_violin(x, y, alpha, colour, fill, linetype, size, weight)

    • alpha: la intensidad del color
    • color: el color de la línea alrededor del violín
    • fill: el color que se usa para rellenar el violín
    • linetype: representa el estilo de línea; vea la sección
    • size: representa el grosor de la línea
    • scale: la escala que se usa para producir el violín tomando en cuenta el tamaño de muestra proporcionalmente; utiliza los parámetros count o width
    • weight: para modificar el valor original; entonces no sería, por ejemplo, el conteo/suma de los valores si no un valor ponderado (promedio ponderado).