Ceci est une répétition d'une question posée à l'origine ici: indiquant la différence statistiquement significative dans le graphique à barres mais a demandé R au lieu de python.
Ma question est très simple. Je veux produire des diagrammes à barres en R, en utilisant si possible ggplot2, avec une indication de différence significative entre les différentes barres, par ex. produire quelque chose comme ça. J'ai fait une recherche mais je ne trouve pas d'autre question demandant exactement la même chose.
Vous pouvez utiliser geom_path()
et annotate()
pour obtenir un résultat similaire. Pour cet exemple, vous devez déterminer vous-même la position appropriée. Dans geom_path()
quatre nombres sont fournis pour obtenir ces petites graduations pour les lignes de connexion.
df<-data.frame(group=c("A","B","C","D"),numb=c(12,24,36,48))
g<-ggplot(df,aes(group,numb))+geom_bar(stat="identity")
g+geom_path(x=c(1,1,2,2),y=c(25,26,26,25))+
geom_path(x=c(2,2,3,3),y=c(37,38,38,37))+
geom_path(x=c(3,3,4,4),y=c(49,50,50,49))+
annotate("text",x=1.5,y=27,label="p=0.012")+
annotate("text",x=2.5,y=39,label="p<0.0001")+
annotate("text",x=3.5,y=51,label="p<0.0001")
Je sais que c'est une vieille question et la réponse de Didzis Elferts fournit déjà une solution au problème. Mais j'ai récemment créé une extension ggplot qui simplifie l'ensemble du processus d'ajout de barres de signification: ggsignif
Au lieu d'ajouter fastidieusement le geom_path
et annotate
à votre tracé, vous ajoutez simplement une seule couche 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)
La documentation complète du paquet est disponible sur CRAN .
J'ai utilisé la méthode suggérée ci-dessus, mais j'ai trouvé la fonction d'annotation plus facile à créer des lignes que la fonction geom_path. Utilisez simplement "segment" au lieu de "texte". Vous devez diviser les choses par segment et définir les valeurs de début et de fin x et y pour chaque segment de ligne.
exemple pour faire des segments de 3 lignes:
annotate("segment", x=c(1,1,2),xend=c(1,2,2), y= c(125,130,130), yend=c(130,130,125))