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)
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"))
La documentación completa del paquete está disponible en CRAN.
Encuentre mi intento a continuación.
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)
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.