Есть ли способ изменить цвет графика, где данные значимы в R - PullRequest
0 голосов
/ 15 марта 2020

Мои данные следующие:

df1<-read.table(text = "time type
12		B88
19		B44
18		B44
13		B88
17		B44",header=TRUE)

Я могу использовать следующие коды, чтобы получить свой участок:

ggplot(df1,aes(type,time)) + geom_boxplot(fill="green")+
  
    stat_compare_means(method = "t.test")

Я хочу получить другой цвет, скажем, синий, для ящика с высоким средним значением, когда значение P меньше 0,05%. Мы можем сделать это? ПРИМЕЧАНИЕ: Я не заинтересован в запуске ttest

Ответы [ 2 ]

3 голосов
/ 15 марта 2020
ggplot(df1,aes(type,time)) + geom_boxplot(fill="green") +
stat_compare_means(method = "t.test") -> p #save your plot as p
build <- ggplot_build(p) # build plot
build$data[[1]][,"fill"] <- ifelse(build$data[[2]][1,"p.format"] < 0.05, list(c("blue","green")),list(rep("green",2))) # changes fill to blue if p value is < 0.05
plot(ggplot_gtable(build)) # plot new formatted graph
1 голос
/ 15 марта 2020

Возможно, это не самый элегантный способ сделать это, но вы можете вычислить значение 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


Используя ваш пример:

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

...