24

我有一个显示多个框的箱线图。我想用一条线将每个盒子的平均值连接在一起。默认情况下,箱线图不显示均值,中间线仅表示中位数。我试过了

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

4

2 回答 2

35

那是你要找的吗?

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:用于数据分析的优雅图形”中找到了解释。在第 51 页,他写道:

不同层上的不同组。

有时我们想根据不同的聚合级别绘制摘要。不同的层可能具有不同的组美学,因此一些显示单个级别的数据,而另一些显示更大组的摘要。

在上一个示例的基础上,假设我们要根据所有男孩的年龄和身高向刚刚创建的绘图添加一条平滑线。如果我们对平滑线使用相同的分组,我们会得到图 4.4 中的第一个图。

p + geom_smooth(aes(group = Subject), method="lm", se = F)

这不是我们想要的;我们无意中为每个男孩添加了一条平滑线。这个新层需要一个不同的组美学,group = 1,这样新的线将基于所有数据,如图中的第二个图所示。修改后的图层如下所示:

p + geom_smooth(aes(group = 1), method="lm", size = 2, se = F)

[...] 在平滑层中使用 aes(group = 1) 适合所有男孩的最佳拟合单线。”

于 2010-10-21T18:23:41.213 回答
1

另一种更长的方法(如果数据在两个不同的中)是:

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 包于 2021-04-15 创建(v1.0.0)


Again, `group = 1` is the key.
于 2020-04-14T20:50:25.873 回答