Возможно, это не самый элегантный способ сделать это, но вы можете вычислить значение p за пределами ggplot2
и, используя оператор ifelse
, присвоить цветную модель, которую вы можете вызвать, используя scale_fill_identity
.
Здесь пример, использующий фиктивный пример:
df <- data.frame(Xval = rep(c("A","B"),each = 50),
Yval = c(sample(1:50,50), sample(50:100,50)))
Я использовал здесь dplyr
последовательность каналов, но вы можете сделать это довольно легко в base r
:
library(dplyr)
library(ggplot2)
df %>% mutate(pval = t.test(Yval~Xval)$p.value) %>%
group_by(Xval) %>% mutate(Mean = mean(Yval)) %>%
ungroup() %>%
mutate(Color = ifelse(pval < 0.05 & Mean == max(Mean), "blue","green")) %>%
ggplot(aes(x = Xval, y = Yval, fill = Color))+
geom_boxplot()+
stat_compare_means(method = "t.test")+
scale_fill_identity()
![enter image description here](https://i.stack.imgur.com/nb3Qg.png)
Используя ваш пример:
df1 %>% mutate(pval = t.test(time~type)$p.value) %>%
group_by(type) %>% mutate(Mean = mean(time)) %>%
ungroup() %>%
mutate(Color = ifelse(pval < 0.05 & Mean == max(Mean), "blue","green")) %>%
ggplot(aes(x = type, y = time, fill = Color))+
geom_boxplot()+
stat_compare_means(method = "t.test")+
scale_fill_identity()
![enter image description here](https://i.stack.imgur.com/F5JRd.png)