Saltar al contenido

Coloque estrellas en los diagramas de barras y diagramas de caja de ggplot para indicar el nivel de importancia (valor p)

Luego de de esta extensa selección de información pudimos resolver este disgusto que tienen algunos usuarios. Te brindamos la respuesta y esperamos servirte de gran ayuda.

Solución:

Sé que esta es una vieja pregunta y la respuesta de Jens Tierling ya proporciona una solución para el problema. Pero recientemente creé una extensión ggplot que simplifica todo el proceso de agregar barras de significado: ggsignif

En lugar de agregar tediosamente el geom_line y geom_text a tu trama solo agregas una sola capa geom_signif:

library(ggplot2)
library(ggsignif)

ggplot(iris, aes(x=Species, y=Sepal.Length)) + 
  geom_boxplot() +
  geom_signif(comparisons = list(c("versicolor", "virginica")), 
              map_signif_level=TRUE)

Diagrama de caja con barra de significado

Para crear una trama más avanzada similar a la que muestra Jens Tierling, puede hacer lo siguiente:

dat <- data.frame(Group = c("S1", "S1", "S2", "S2"),
              Sub   = c("A", "B", "A", "B"),
              Value = c(3,5,7,8))  

ggplot(dat, aes(Group, Value)) +
  geom_bar(aes(fill = Sub), stat="identity", position="dodge", width=.5) +
  geom_signif(stat="identity",
              data=data.frame(x=c(0.875, 1.875), xend=c(1.125, 2.125),
                              y=c(5.8, 8.5), annotation=c("**", "NS")),
              aes(x=x,xend=xend, y=y, yend=y, annotation=annotation)) +
  geom_signif(comparisons=list(c("S1", "S2")), annotations="***",
              y_position = 9.3, tip_length = 0, vjust=0.4) +
  scale_fill_manual(values = c("grey80", "grey20"))

ingrese la descripción de la imagen aquí

La documentación completa del paquete está disponible en CRAN.

Encuentre mi intento a continuación.

Ejemplo de parcela

Primero, creé algunos datos ficticios y un diagrama de barras que se puede modificar como deseemos.

windows(4,4)

dat <- data.frame(Group = c("S1", "S1", "S2", "S2"),
                  Sub   = c("A", "B", "A", "B"),
                  Value = c(3,5,7,8))  

## Define base plot
p <-
ggplot(dat, aes(Group, Value)) +
    theme_bw() + theme(panel.grid = element_blank()) +
    coord_cartesian(ylim = c(0, 15)) +
    scale_fill_manual(values = c("grey80", "grey20")) +
    geom_bar(aes(fill = Sub), stat="identity", position="dodge", width=.5)

Agregar asteriscos sobre una columna es fácil, como ya mencionó baptiste. Solo crea un data.frame con las coordenadas.

label.df <- data.frame(Group = c("S1", "S2"),
                       Value = c(6, 9))

p + geom_text(data = label.df, label = "***")

Para agregar los arcos que indican una comparación de subgrupos, calculé las coordenadas paramétricas de un semicírculo y las agregué conectadas con geom_line. Los asteriscos también necesitan nuevas coordenadas.

label.df <- data.frame(Group = c(1,1,1, 2,2,2),
                       Value = c(6.5,6.8,7.1, 9.5,9.8,10.1))

# Define arc coordinates
r <- 0.15
t <- seq(0, 180, by = 1) * pi / 180
x <- r * cos(t)
y <- r*5 * sin(t)

arc.df <- data.frame(Group = x, Value = y)

p2 <-
p + geom_text(data = label.df, label = "*") +
    geom_line(data = arc.df, aes(Group+1, Value+5.5), lty = 2) +
    geom_line(data = arc.df, aes(Group+2, Value+8.5), lty = 2)

Por último, para indicar la comparación entre grupos, construí un círculo más grande y lo aplané en la parte superior.

r <- .5
x <- r * cos(t)
y <- r*4 * sin(t)
y[20:162] <- y[20] # Flattens the arc

arc.df <- data.frame(Group = x, Value = y)

p2 + geom_line(data = arc.df, aes(Group+1.5, Value+11), lty = 2) +
     geom_text(x = 1.5, y = 12, label = "***")

También hay una extensión del paquete ggsignif llamada ggpubr que es más poderosa cuando se trata de comparaciones multigrupo. Se basa en ggsignif, pero también maneja anova y kruskal-wallis, así como comparaciones por pares contra la media global.

Ejemplo:

library(ggpubr)

my_comparisons = list( c("0.5", "1"), c("1", "2"), c("0.5", "2") )

ggboxplot(ToothGrowth, x = "dose", y = "len",
          color = "dose", palette = "jco")+ 
  stat_compare_means(comparisons = my_comparisons, label.y = c(29, 35, 40))+
  stat_compare_means(label.y = 45)

ingrese la descripción de la imagen aquí

Si entiendes que ha sido de utilidad nuestro post, te agradeceríamos que lo compartas con otros entusiastas de la programación y nos ayudes a difundir nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *