用一条线连接箱线图(ggplot2)
Posted
技术标签:
【中文标题】用一条线连接箱线图(ggplot2)【英文标题】:Joining means on a boxplot with a line (ggplot2) 【发布时间】:2011-04-28 17:55:42 【问题描述】:我有一个显示多个框的箱线图。我想用一条线将每个盒子的平均值连接起来。默认情况下,箱线图不显示均值,中间线仅表示中位数。我试过了
ggplot(data, aes(x=xData, y=yData, group=g))
+ geom_boxplot()
+ stat_summary(fun.y=mean, geom="line")
这不起作用。
有趣的是,做
stat_summary(fun.y=mean, geom="point")
在每个框中绘制中点。为什么“线”不起作用?
类似的东西,但使用 ggplot2,http://www.aliquote.org/articles/tech/RMB/c4_sols/plot45.png
【问题讨论】:
如果有人能说出 Bernd 解决方案中 group=1 的基本原理,那就太好了。 我的猜测是 group=1 禁用组美学,因为如果启用它,则为每个组分别绘制线条,在平均值的情况下,这只是一个点,因此会有没有要画的线。 是的,我认为你是对的。我在 Hadley Wickham 的书中找到了一个很好的解释并更新了我的答案。 【参考方案1】:这就是你要找的吗?
library(ggplot2)
x <- factor(rep(1:10, 100))
y <- rnorm(1000)
df <- data.frame(x=x, y=y)
ggplot(df, aes(x=x, y=y)) +
geom_boxplot() +
stat_summary(fun=mean, geom="line", aes(group=1)) +
stat_summary(fun=mean, geom="point")
更新:
关于设置 group=1 的一些说明:我认为我在 Hadley Wickham 的书“ggplot2: Elegant Graphics for Data Analysis”中找到了解释。他在第 51 页上写道:
不同层的不同组。
有时我们想绘制摘要 根据不同层次 聚合。不同的层可能 有不同的群体审美,所以 有些显示个人水平 数据,而其他显示摘要 更大的群体。
在上一个示例的基础上, 假设我们要添加一个平滑 线到刚刚创建的情节,基于 在所有的年龄和高度 男孩们。如果我们使用相同的分组 我们用于线条的平滑度, 我们得到图 4.4 中的第一个图。
p + geom_smooth(aes(group = Subject), 方法="lm", se = F)
这不是我们想要的;我们有 无意中添加了一条平滑线 对于每个男孩。这个新层需要一个 不同的群体审美,group = 1, 这样新行将基于 所有数据,如第二个所示 图中的情节。修改层 看起来像这样:
p + geom_smooth(aes(group = 1), 方法=“lm”,大小=2,se=F)
[...] 在 平滑层适合单行 最适合所有男孩。”
【讨论】:
Äh,我知道这个问题会来 :-) 对不起,但我必须承认我不知道。几周前,我遇到了类似的问题,并在某个地方找到了对我有用的解决方案。 这需要 fun.y=mean 而不是 fun=mean【参考方案2】:另一种更长的方法(如果数据在两个不同的dataframes 中)是:
library(dplyr); library(ggplot2)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
x <- factor(rep(1:10, 100)); y <- rnorm(1000);
df <- data.frame(x=x, y=y);
df_for_line <- df %>% group_by(x) %>% summarise(mean_y = mean(y));
ggplot(df, aes(x = x, y = y)) + geom_boxplot() +
geom_path(data = df_for_line, aes(x = x, y = mean_y, group = 1))
由reprex package (v1.0.0) 于 2021-04-15 创建
Again, `group = 1` is the key.
【讨论】:
UseMethod("group_by") 中的错误:没有适用于 'group_by' 的方法应用于“因子”类的对象 @Aliton,感谢您提供的信息,刚刚更正。以上是关于用一条线连接箱线图(ggplot2)的主要内容,如果未能解决你的问题,请参考以下文章