Одним из решений является использование пакета ggsignif
, но сначала вам нужно подготовить вывод TukeyHSD
для его использования в ggsignif
:
AOV <- aov(Rate~Level, data = df)
t <-as.data.frame(TukeyHSD(AOV)$Level)
library(tidyverse)
MAX <-df %>% group_by(Level) %>% summarise(Max = max(Rate))
T1 <- t %>% rownames_to_column("Group") %>%
mutate(Start = sub("^(.).*","\\1",Group),
End = sub(".*(.)$","\\1",Group)) %>%
left_join(.,MAX, by = c("Start" = "Level")) %>%
left_join(.,MAX, by = c("End" = "Level")) %>%
mutate(End = factor(End)) %>%
rowwise() %>%mutate(ypos = max(Max.x, Max.y)*(1+0.25*as.numeric(End)))
Source: local data frame [6 x 10]
Groups: <by row>
# A tibble: 6 x 10
Group diff lwr upr `p adj` Start End Max.x Max.y ypos
<chr> <dbl> <dbl> <dbl> <dbl> <chr> <fct> <dbl> <dbl> <dbl>
1 B-A -0.0666 -0.378 0.245 0.927 B A 0.334 0.296 0.417
2 C-A -0.0611 -0.403 0.281 0.955 C A 0.159 0.296 0.370
3 D-A 0.127 -0.262 0.515 0.789 D A 0.803 0.296 1.00
4 C-B 0.00550 -0.285 0.296 1.00 C B 0.159 0.334 0.500
5 D-B 0.193 -0.152 0.538 0.405 D B 0.803 0.334 1.20
6 D-C 0.188 -0.184 0.559 0.492 D C 0.803 0.159 1.41
Теперь вы можете построить свои данные и добавить значение, основанное на наборе данных T1:
library(ggsignif)
library(ggplot2)
ggplot(df, aes(x = Level, y = Rate))+
geom_jitter(width = 0.2)+
stat_summary(fun.data = "mean_cl_normal", geom = "errorbar", width = 0, color = "red") +
stat_summary(fun = "mean", geom = "errorbar", aes(ymax = ..y.., ymin = ..y..), col = "red", width = 0.5) +
geom_signif(data = subset(T1,`p adj` <0.5), manual = TRUE,
aes(xmax = End, xmin = Start, y_position= ypos, annotations = round(`p adj`,3)))