如何在 ggplot2 boxplot 中为每组添加多个观察值并使用组平均值?
Posted
技术标签:
【中文标题】如何在 ggplot2 boxplot 中为每组添加多个观察值并使用组平均值?【英文标题】:How to add a number of observations per group and use group mean in ggplot2 boxplot? 【发布时间】:2013-03-17 15:37:16 【问题描述】:我正在做一个基本的箱线图,其中y=age
和x=Patient groups
age <- ggplot(data, aes(factor(group2), age)) + ylim(15, 80)
age + geom_boxplot(fill = "grey80", colour = "#3366FF")
我希望你能帮我做一些事情:
1) 是否可以在每个组箱线图上方(但不在我的组标签所在的 X 轴上)包含每个组的多个观察值,而不必在绘画中执行此操作:)? 我试过使用:
age + annotate("text", x = "CON", y = 60, label = "25")
其中CON
是第一组,y = 60
是 ~ 就在该组的箱线图上方。但是,该命令不起作用。我认为它与将x
读取为连续变量而不是分类变量有关。
2) 此外,尽管有很多关于箱线图使用均值而不是中值的问题,但我仍然没有找到适合我的代码?
3) 在同样的问题上,有没有一种方法可以将平均组统计数据包含在箱线图中?也许使用
age + stat_summary(fun.y=mean, colour="red", geom="point")
然而,它只包括一个点,表示平均值所在的位置。或再次使用
age + annotate("text", x = "CON", y = 30, label = "30")
其中CON
是第一组,y = 30
是~ 组年龄平均值。
知道ggplot2
语法是多么灵活和丰富,我希望有一种更优雅的方式来使用真实的统计输出而不是annotate
。
任何建议/链接将不胜感激!
谢谢!!
【问题讨论】:
箱线图通常有最小、下、中、上分位数,最后是最大值。您已经有了 .25、.5 和 .75 分位数。这些信息还不够丰富吗? 这是我被要求的格式。 【参考方案1】:这和你所追求的一样吗? stat_summary
,根据要求:
# function for number of observations
give.n <- function(x)
return(c(y = median(x)*1.05, label = length(x)))
# experiment with the multiplier to find the perfect position
# function for mean labels
mean.n <- function(x)
return(c(y = median(x)*0.97, label = round(mean(x),2)))
# experiment with the multiplier to find the perfect position
# plot
ggplot(mtcars, aes(factor(cyl), mpg, label=rownames(mtcars))) +
geom_boxplot(fill = "grey80", colour = "#3366FF") +
stat_summary(fun.data = give.n, geom = "text", fun.y = median) +
stat_summary(fun.data = mean.n, geom = "text", fun.y = mean, colour = "red")
黑色数字是观察次数,红色数字是平均值。 joran 的回答向您展示了如何将数字放在框的顶部
帽子提示:https://***.com/a/3483657/1036500
【讨论】:
有关此答案的变体,包括如何使用n = 11
等进行注释,请参见此处:***.com/a/15720769/1036500【参考方案2】:
我想这也许就是你要找的东西?
myboxplot <- ddply(mtcars,
.(cyl),
summarise,
min = min(mpg),
q1 = quantile(mpg,0.25),
med = median(mpg),
q3 = quantile(mpg,0.75),
max= max(mpg),
lab = length(cyl))
ggplot(myboxplot, aes(x = factor(cyl))) +
geom_boxplot(aes(lower = q1, upper = q3, middle = med, ymin = min, ymax = max), stat = "identity") +
geom_text(aes(y = max,label = lab),vjust = 0)
我刚刚意识到,当您询问均值时,我错误地使用了中位数,但显然您可以随意使用 middle
美学的任何函数。
【讨论】:
抱歉,最后一个问题。是否可以更改组的顺序?不幸的是,我对数字或数据驱动的订单不感兴趣。我能想到的唯一方法是重新编码组变量。您的帮助将不胜感激!再次感谢!【参考方案3】:回答第一个问题。
要在框上方显示值,您应该提供 x
值作为数字而不是级别名称。因此,要绘制高于第一个值的值,请给出x=1
。
data(ToothGrowth)
ggplot(ToothGrowth,aes(supp,len))+geom_boxplot()+
annotate("text",x=1,y=32,label=30)
【讨论】:
嗨!万分感谢。我最初实际上尝试了数字/级别,但由于某种原因没有任何效果。现在好了,非常感谢。 annotate 命令非常适合修复定位问题!非常感谢以上是关于如何在 ggplot2 boxplot 中为每组添加多个观察值并使用组平均值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 中为 plotly boxplot 添加标签?
R语言使用ggplot2包使用geom_boxplot函数绘制基础分组水平箱图(boxplot)实战
R语言使用ggplot2包使用geom_boxplot函数绘制基础分组缺口箱图(notch boxplot)实战
如何在 R 中为 plotly boxplots 自定义悬停文本
R语言ggplot2可视化时间序列数据:ggplot2可视化在时间轴上添加按月的箱图(boxplot)
R语言ggplot2可视化箱图(boxplot)自定义设置抑制箱图中异常值数据点的输出(removes boxplot outliers in the ggplot2 graph)