2017-06-23 93 views
2

好的,所以我覺得我和這個很接近,但是當我試圖在最後構建我的盒子情節時出現錯誤。我的目標是放置表示每個箱形圖上方時間點之間的統計關係的字母。我在這個網站上看到了兩次這樣的討論,可以從他們的代碼中重現結果,但是不能將其應用到我的數據集中。ggplot boxplot上的Tukeys post-hoc

library(ggplot2) 
library(multcompView) 
library(plyr) 

這裏是我的數據:

dput(WaterConDryMass) 
structure(list(ChillTime = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L), .Label = c("Pre_chill", 
"6", "13", "24", "Post_chill"), class = "factor"), dmass = c(0.22, 
0.19, 0.34, 0.12, 0.23, 0.33, 0.38, 0.15, 0.31, 0.34, 0.45, 0.48, 
0.59, 0.54, 0.73, 0.69, 0.53, 0.57, 0.39, 0.8)), .Names = c("ChillTime", 
"dmass"), row.names = c(NA, -20L), class = "data.frame") 

ANOVA和Tukey事後

Model4 <- aov(dmass~ChillTime, data=WaterConDryMass) 
tHSD <- TukeyHSD(Model4, ordered = FALSE, conf.level = 0.95) 
plot(tHSD , las=1 , col="brown") 

功能:

generate_label_df <- function(TUKEY, flev){ 

    # Extract labels and factor levels from Tukey post-hoc 
    Tukey.levels <- TUKEY[[flev]][,4] 
    Tukey.labels <- multcompLetters(Tukey.levels)['Letters'] 
    plot.labels <- names(Tukey.labels[['Letters']]) 

    boxplot.df <- ddply(WaterConDryMass, flev, function (x) max(fivenum(x$y)) + 0.2) 

    # Create a data frame out of the factor levels and Tukey's homogenous group letters 
    plot.levels <- data.frame(plot.labels, labels = Tukey.labels[['Letters']], 
          stringsAsFactors = FALSE) 

    # Merge it with the labels 
    labels.df <- merge(plot.levels, boxplot.df, by.x = 'plot.labels', by.y = flev, sort = FALSE) 
    return(labels.df) 
} 

箱圖:

ggplot(WaterConDryMass, aes(x = ChillTime, y = dmass)) + 
    geom_blank() + 
    theme_bw() + 
    theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) + 
    labs(x = 'Time (weeks)', y = 'Water Content (DM %)') + 
    ggtitle(expression(atop(bold("Water Content"), atop(italic("(Dry Mass)"), "")))) + 
    theme(plot.title = element_text(hjust = 0.5, face='bold')) + 
    annotate(geom = "rect", xmin = 1.5, xmax = 4.5, ymin = -Inf, ymax = Inf, alpha = 0.6, fill = "grey90") + 
    geom_boxplot(fill = 'green2', stat = "boxplot") + 
    geom_text(data = generate_label_df(tHSD), aes(x = plot.labels, y = V1, label = labels)) + 
    geom_vline(aes(xintercept=4.5), linetype="dashed") + 
    theme(plot.title = element_text(vjust=-0.6)) 

錯誤:

Error in HSD[[flev]] : invalid subscript type 'symbol' 

回答

1

我想我發現你是以下教程,或者非常類似的東西。您可能最好將這整個東西複製並粘貼到您的工作空間,功能和所有內容中,以避免遺漏一些小的差異。

基本上我已經按照教程(http://www.r-graph-gallery.com/84-tukey-test/)來寫了這封信,並在最後添加了一些必要的調整。它增加了一些額外的代碼行,但它的工作原理。

generate_label_df <- function(TUKEY, variable){ 

    # Extract labels and factor levels from Tukey post-hoc 
    Tukey.levels <- TUKEY[[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(WaterConDryMass$dmass~WaterConDryMass$ChillTime) 
ANOVA=aov(model) 

# Tukey test to study each pair of treatment : 
TUKEY <- TukeyHSD(x=ANOVA, 'WaterConDryMass$ChillTime', conf.level=0.95) 

labels<-generate_label_df(TUKEY , "WaterConDryMass$ChillTime")#generate labels using function 

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

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

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

ggplot(WaterConDryMass, aes(x = ChillTime, y = dmass)) + 
    geom_blank() + 
    theme_bw() + 
    theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) + 
    labs(x = 'Time (weeks)', y = 'Water Content (DM %)') + 
    ggtitle(expression(atop(bold("Water Content"), atop(italic("(Dry Mass)"), "")))) + 
    theme(plot.title = element_text(hjust = 0.5, face='bold')) + 
    annotate(geom = "rect", xmin = 1.5, xmax = 4.5, ymin = -Inf, ymax = Inf, alpha = 0.6, fill = "grey90") + 
    geom_boxplot(fill = 'green2', stat = "boxplot") + 
    geom_text(data = final, aes(x = ChillTime, y = dmass, label = Letters),vjust=-3.5,hjust=-.5) + 
    geom_vline(aes(xintercept=4.5), linetype="dashed") + 
    theme(plot.title = element_text(vjust=-0.6)) 

enter image description here