使用geom_boxplot,facet_grid时,将注释或文本添加到单个框图中

时间:2016-08-24 13:07:50

标签: r ggplot2

我正在使用ggplot2并构建了一个像这样的箱形图:

fruit ggplot

这是使用以下数据和代码构建的:

structure(list(group = c("C", "C", "C", "C", "C", "C", "C", "C", 
"C", "C", "V", "V", "V", "V", "V", "V", "V", "V", "V", "V", "C", 
"C", "C", "C", "C", "C", "C", "C", "C", "V", "V", "V", "V", "V", 
"V", "V", "V", "V", "V", "C", "C", "C", "C", "C", "V", "V", "V", 
"V", "V", "V", "V", "V", "V", "V", "C", "C", "C", "C", "C", "C", 
"C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", 
"C", "V", "V", "V", "V", "V", "V", "V", "V", "V", "V", "C", "C", 
"C", "C", "C", "C", "C", "C", "C", "C", "V", "V", "V", "V", "V", 
"V", "V", "V", "V", "V", "C", "C", "C", "C", "C", "C", "C", "C", 
"C", "V", "V", "V", "V", "V", "V", "V", "V", "V", "V"), fruit = c("apple", 
"apple", "apple", "apple", "apple", "apple", "apple", "apple", 
"apple", "apple", "apple", "apple", "apple", "apple", "apple", 
"apple", "apple", "apple", "apple", "apple", "apple", "apple", 
"apple", "apple", "apple", "apple", "apple", "apple", "apple", 
"apple", "apple", "apple", "apple", "apple", "apple", "apple", 
"apple", "apple", "apple", "apple", "apple", "apple", "apple", 
"apple", "orange", "orange", "orange", "orange", "orange", "orange", 
"orange", "orange", "orange", "orange", "orange", "orange", "orange", 
"orange", "orange", "orange", "orange", "orange", "orange", "orange", 
"orange", "orange", "orange", "orange", "orange", "orange", "orange", 
"orange", "orange", "orange", "orange", "orange", "orange", "orange", 
"orange", "orange", "orange", "orange", "orange", "orange", "orange", 
"orange", "orange", "orange", "orange", "pear", "pear", "pear", 
"pear", "pear", "pear", "pear", "pear", "pear", "pear", "pear", 
"pear", "pear", "pear", "pear", "pear", "pear", "pear", "pear", 
"pear", "pear", "pear", "pear", "pear", "pear", "pear", "pear", 
"pear", "pear", "pear", "pear", "pear", "pear", "pear"), treatment =  c("pre", 
"pre", "pre", "pre", "pre", "post", "post", "post", "post", "post", 
"pre", "pre", "pre", "pre", "pre", "post", "post", "post", "post", 
"post", "pre", "pre", "pre", "pre", "pre", "post", "post", "post", 
"post", "pre", "pre", "pre", "pre", "pre", "post", "post", "post", 
"post", "post", "pre", "pre", "pre", "pre", "pre", "pre", "pre", 
"pre", "pre", "pre", "post", "post", "post", "post", "post", 
"pre", "pre", "pre", "pre", "pre", "post", "post", "post", "post", 
"post", "pre", "pre", "pre", "pre", "pre", "post", "post", "post", 
"post", "post", "pre", "pre", "pre", "pre", "pre", "post", "post", 
"post", "post", "post", "pre", "pre", "pre", "pre", "pre", "pre", 
"pre", "pre", "pre", "pre", "pre", "pre", "pre", "pre", "pre", 
"post", "post", "post", "post", "post", "pre", "pre", "pre", 
"pre", "pre", "post", "post", "post", "post", "pre", "pre", "pre", 
"pre", "pre", "post", "post", "post", "post", "post"), subgroup = c(66, 
66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 
67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 
69, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 
71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 
73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 
74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 77, 77, 77, 
77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 
79, 79, 79, 79, 79, 79, 79, 79, 79, 79), conc = c(0.074, 0.204, 
0.118, 0.25, 0.159, 0.283, 0.253, 0.436, 0.295, 0.335, 0.204, 
0.424, 0.254, 0.217, 0.281, 0.153, 0.309, 0.184, 0.341, 0.168, 
0.14, 0.213, 0.29, 0.266, 0.522, 0.219, 0.34, 0.317, 0.053, 0.196, 
0.072, 0.185, 0.269, 0.157, 0.344, 0.398, 0.304, 0.173, 0.212, 
0.197, 0.154, 0.289, 0.212, 0.217, 0.314, 0.337, 0.116, 0.209, 
0.256, 0.165, 0.216, 0.284, 0.148, 0.151, 0.105, 0.097, 0.201, 
0.125, 0.208, 0.334, 0.209, 0.269, 0.388, 0.182, 0.12, 0.28, 
0.253, 0.226, 0.257, 0.193, 0.314, 0.262, 0.12, 0.415, 0.2, 0.209, 
0.202, 0.08, 0.341, 0.221, 0.598, 0.327, 0.258, 0.655, 0.071,  
0.209, 0.234, 0.19, 0.117, -0.01, 0.074, 0.038, 0.06, 0.088, 
0.034, 0.057, 0.099, 0.046, 0.096, 0.166, 0.045, 0.104, 0.08, 
0.248, 0.031, 0.056, 0.101, 0.077, 0.069, 0.251, 0.585, 0.427, 
0.145, 0.109, 0.125, 0.079, 0.068, 0.064, 0.184, 0.202, 0.263, 
0.302, 0.136)), .Names = c("group", "fruit", "treatment", "subgroup", 
"conc"), row.names = c(NA, -123L), class = "data.frame")

require(ggplot2)
plot<-ggplot(prot, aes(x=group, y=conc, fill=factor(treatment)))+ 
geom_boxplot() + 
scale_fill_manual(values=cbPalette)+
theme_bw()+
facet_grid(.~fruit)+    
labs(fill="treatment status", y="Concentration (mg.ml-1) ") +
theme(legend.position="bottom", axis.title.y=element_text(size=12, hjust=0.5, vjust=1, face="bold"), axis.text.y=element_text(size=8), axis.title.x=element_text(size=12, hjust=0.5, vjust=0.5, face="bold"), axis.text.x=element_text(size=8))  +
scale_y_continuous(limits=c(-0.01,0.7), breaks=seq(0,0.7,0.1))

我现在想添加小写字母,例如a,b,c高于某些箱图,表示统计显着性。例如,第一小平面中的第一个框之上的“a”和第二小平面中的第二个和第三个框之上的“b”。但是,我似乎只能在每个方面或单个方面的所有字母中重复出现字母。

在许多其他根本不起作用的事情中,我对这些尝试非常接近:

plot+ annotate("text", label =c("a", "b", "c"), size = 4, x =c(2,1,2), y = c(0.5, 0.3, 0.4))

df1<-data.frame(group=c(0.8, 1.2, 1.8, 2.2), conc=c(0.4, 0.4), lab="text", id=factor("apple", levels=c("apple", "orange", "pear")), treatment=factor(2, levels=c("pre", "post")))

plot+ geom_text(data=df1, label=c("a", "b", "a", "d"))

我觉得我需要更好地指定facet“id = factor(”apple“....如果我只希望在一个方面注释,但不是多个。

2 个答案:

答案 0 :(得分:0)

执行此操作的常用方法是创建包含绘图信息的新数据集。此数据集应包含三个分组变量(水果,组和处理)中的每一个的信息,以便正确放置文本。它还将包含要为每个箱图添加的标签的变量,以及y的位置。标签应放在每个箱图上方。

以下是如何制作此数据集的示例。我正在使用 dplyr 中的一些函数将三个分组变量以与绘图相同的顺序放入数据集中(按水果排序,然后是组,然后是处理)。

library(dplyr)

prot2 = distinct(prot, fruit, group, treatment) %>%
    arrange(fruit, group, treatment)

现在添加y位置。您可能希望每个方框都有不同的展示位置,但此处我使用原始数据集中的最大conc加上一点点。

prot2$yloc = max(prot$conc) + .05

现在是标签。如果您在某处存储了其他信息,告诉您哪些标签放在哪个箱图上,这将是最简单的。在这里,我用手写出来为第一个面板中的第一个框添加“a”,为第二个面板中的中间两个框添加“b”,小心地匹配prot2的顺序。我已为其他所有内容添加了NA,因此我可以在position_dodge中使用geom_text

prot2$label = c("a", NA, NA, NA, NA, "b", "b", NA, NA, NA, NA, NA)

现在通过geom_text将文字添加到地图中,使用position_dodge来正确排列内容。我必须更改y限制,以便标签显示,您可以在scale_y_continuous之前执行此操作。

plot + 
    ylim(NA, max(prot$conc) + .05) +
    geom_text(data = prot2, aes(y = yloc, label = label), 
               position = position_dodge(width = .75))

enter image description here

答案 1 :(得分:0)

我尝试使用相同的方法添加注释。从excel导入数据并使用以下代码

view(pans) 
head(pans) 
rep <- factor(pans$rep) 
trt <- factor(pans$trt) 
yr <- factor(pans$yr) 
st <- factor(pans$st) 
p <- ggplot(pans, aes(x = st, y = act)) 
q<-p + geom_boxplot(aes(fill = trt), position = position_dodge(0.8)) + 
       stat_summary(fun = mean, geom = "point", shape=5, size=1.5,
       aes(group = trt), position = position_dodge(0.8)) + 
       scale_fill_manual(name="System", values = c("grey50","grey90", "grey100")) +    
       facet_grid(. ~ yr)+
       theme_bw() 
plot<-q + scale_x_discrete(breaks=c("b","h"), labels=c("BS", "AH")) 
plot2<-plot + theme(axis.title.x = element_blank()) 
plot2

我得到了以下情节 enter image description here

#用于添加我使用的比较字母

pans2 = distinct(pans, yr, st, trt) %>%
  arrange(yr, st, trt)
pans2$yloc = max(pans$act) + .05
prot2$label = c("a", "b", "a", "b", "b", "b", "a", "b", "a", "b", "b", "b")
plot2 + geom_text(data = pans2, aes(y = yloc, label = label), 
          position = position_dodge(width = .75))

但是,我收到以下错误

不知道如何为函数类型的对象自动选择比例。默认为连续。 错误:美学必须是有效的数据列。有问题的美学:标签 = 标签。 您是否输入了数据列的名称或忘记添加 after_stat()? 运行 rlang::last_error() 以查看错误发生的位置。