Boxplot上的全文标签,加上平均点

时间:2015-01-29 22:17:44

标签: r ggplot2 boxplot

我试图获得类似于https://stats.stackexchange.com/questions/8206/labeling-boxplots-in-r的文字标签,但我无法让它发挥作用。 MWE与我的相似之处是:

data <- data.frame(replicate(5,sample(0:100,100,rep=TRUE)))

meanFunction <- function(x){
return(data.frame(y=round(mean(x),2),label=round(mean(x,na.rm=T),2)))}

ggplot(melt(data), aes(x=variable, y=value)) +
geom_boxplot(aes(fill=variable), width = 0.7) +
stat_summary(fun.y = mean, geom="point",colour="darkred", size=4) +
stat_summary(fun.data = meanFunction, geom="text", size = 4, vjust=1.3) 

产生类似于&#34; A&#34;在附图中,我正试图得到像&#34; B&#34;为每个盒子。感谢。enter image description here

2 个答案:

答案 0 :(得分:2)

这是我的尝试。首先,我重塑了你的数据。然后,我制作了你的盒子图。我改变了文本的大小和颜色。然后,我查看了ggplot使用的数据,您可以使用ggplot_build(objectname)$data[[1]]访问该数据。你可以看到你需要的数字。我选择了必要的变量并重新整形了数据,即df。使用df,您可以注释所需的数字。

library(dplyr)
library(tidyr)
library(ggplot2)

set.seed(123)
mydf <- data.frame(replicate(5,sample(0:100,100,rep=TRUE)))

mydf <- gather(mydf, variable, value)

meanFunction <- function(x){
return(data.frame(y=round(mean(x),2),label=round(mean(x,na.rm=T),2)))}

g <- ggplot(data = mydf, aes(x = variable, y = value, fill = variable)) +
     geom_boxplot(width = 0.5) +
     stat_summary(fun.y = mean, geom = "point",colour = "darkred", size=4) +
     stat_summary(fun.data = meanFunction, geom ="text", color = "white", size = 3, vjust = 1.3)

df <- ggplot_build(g)$data[[1]] %>%
       select(ymin:ymax, x) %>%
       gather(type, value, - x) %>%
       arrange(x)

g + annotate("text", x = df$x + 0.4, y = df$value, label = df$value, size = 3)

enter image description here

答案 1 :(得分:2)

首先,我会获取您的数据,然后自己计算所有的boxplot功能。这是一种方法

dd <- data.frame(replicate(5,sample(0:100,100,rep=TRUE)))

tt <- data.frame(t(sapply(dd, function(x) c(boxplot.stats(x)$stats, mean(x)))))
names(tt) <- c("ymin","lower","middle","upper","ymax", "mean")
tt$var <- factor(rownames(tt))

我确信使用dplyr有更好的方法可以做到这一点,但这一点是你需要自己计算这些值,以便知道在哪里绘制标签。然后就可以了

ggplot(tt) + 
   geom_boxplot(aes(x=var, ymin=ymin, lower=lower, middle=middle, upper=upper, ymax=ymax), stat="identity", width=.5) + 
   geom_text(aes(x=as.numeric(var)+.3, y=middle, label=formatC(middle,1, format="f")), hjust=0) +
   geom_text(aes(x=as.numeric(var)+.3, y= lower, label=formatC(lower,1, format="f")), hjust=0) +
   geom_text(aes(x=as.numeric(var)+.3, y= upper, label=formatC(upper,1, format="f")), hjust=0) + 
   geom_text(aes(x=as.numeric(var)+.3, y= ymax, label=formatC(ymax,1, format="f")), hjust=0) + 
   geom_text(aes(x=as.numeric(var)+.3, y= ymin, label=formatC(ymin,1, format="f")), hjust=0) + 
   geom_point(aes(x=var, y=mean)) + 
   geom_text(aes(x=as.numeric(var), y= mean, label=formatC(mean,1, format="f")), hjust=.5, vjust=1.5)

绘制每个标签

enter image description here