首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于geom_boxplot和facet_grid的Tukey测试结果

基于geom_boxplot和facet_grid的Tukey测试结果
EN

Stack Overflow用户
提问于 2018-10-29 04:16:16
回答 1查看 2.7K关注 0票数 2

我想把代表图基的HSD的结果的字母放在我用ggplot制作的盒子图上。我知道其他的帖子(Tukeys post-hoc on ggplot boxplotTukey's results on boxplot in R),但在我的例子中,我与facet_grid一起工作,我不知道如何继续。由于我正在创建很多的盒子情节,我希望有一些自动化的东西。任何帮助我开始工作的建议都将不胜感激。非常感谢

代码语言:javascript
复制
library(multcompView)
library(ggplot2)
#sample dataframe
df <- data.frame(var_facet=c('facet1', 'facet1', 'facet1', 'facet1', 'facet1', 
                             'facet1', 'facet1', 'facet1', 'facet1', 'facet1', 
                             'facet2', 'facet2', 'facet2', 'facet2', 'facet2', 
                             'facet2', 'facet2', 'facet2', 'facet2', 'facet2'), 
                 class_x=c("Q1", "Q1", "Q1", "Q2", "Q2", "Q2", "Q3", "Q3", "Q3", "Q3", 
                              "Q1", "Q1", "Q1", "Q2", "Q2", "Q2", "Q3", "Q3", "Q3", "Q3"),
                 value_y=c(12, 21, 35, 42, 56, 1, 4, 3, 4, 5, 2, 2, 2, 
                           2, 2, 4, 4, 4, 4, 4))

#function 
generate_label_df <- function(TUKEY, variable){

  # Extract labels and factor levels from Tukey post-hoc 
  Tukey.levels <- variable[,4]
  Tukey.labels <- data.frame(multcompLetters(Tukey.levels)['Letters'])

  #I need to put the labels in the same order as in the boxplot :
  Tukey.labels$treatment=rownames(Tukey.labels)
  Tukey.labels=Tukey.labels[order(Tukey.labels$treatment) , ]
  return(Tukey.labels)
}

model=lm(value_y~class_x, data=df)
ANOVA=aov(model)
TUKEY <- TukeyHSD(ANOVA)
plot(TUKEY , las=1 , col="brown" )

labels <- generate_label_df(TUKEY , TUKEY$`class_x`)#generate labels using function

names(labels) <- c('Letters','class_x')#rename columns for merging

yvalue <- aggregate(.~class_x, data=df, mean)# obtain letter position for y axis using means

final <- merge(labels,yvalue) #merge dataframes

#ggplot with facet_grid
p <- ggplot(data=df, aes(class_x , value_y, fill=class_x))+  
  geom_boxplot(outlier.shape = NA) +
  facet_grid(~var_facet)
p <- p +  scale_y_continuous(limits = quantile(df$value_y, c(0.1, 0.9), na.rm=T))
p <- p + theme_minimal()
p <- p + scale_fill_brewer(palette="Greens")
p <- p + theme(legend.position="none")
p <- p + theme(axis.text.x=element_text(angle=45, hjust=1))
p <- p + geom_text(data = final, 
                   aes(x = class_x, y = value_y, label = Letters), 
                   vjust=-3.5,hjust=-.5)
p
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-04 10:02:00

也许这就是你要找的。

代码语言:javascript
复制
p <- ggplot(data=df, aes(x=class_x , y=value_y, fill=class_x)) +  
     geom_boxplot(outlier.shape=NA) +
     facet_grid(~var_facet) +
     scale_fill_brewer(palette="Greens") +
     theme_minimal() +
     theme(legend.position="none") +
     theme(axis.text.x=element_text(angle=45, hjust=1)) 

for (facetk in as.character(unique(df$var_facet))) {   
  subdf <- subset(df, var_facet==facetk)
  model=lm(value_y ~ class_x, data=subdf)
  ANOVA=aov(model)
  TUKEY <- TukeyHSD(ANOVA)

  labels <- generate_label_df(TUKEY , TUKEY$`class_x`)
  names(labels) <- c('Letters','class_x')
  yvalue <- aggregate(.~class_x, data=subdf, quantile, probs=.75)  
  final <- merge(labels, yvalue)
  final$var_facet <-  facetk

  p <- p + geom_text(data = final,  aes(x=class_x, y=value_y, label=Letters), 
                   vjust=-1.5, hjust=-.5)
}
p

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53038671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档