R语言 连接意味着在箱线图上有一条线

gojuced7  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(106)

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

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,https://aliquote.org/pub/RMB/c4_sols/RMB_c4_sols.html#Fig.%203

hts6caw3

hts6caw31#

这就是你要找的吗

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的一些说明:我想我在哈德利·威克姆的书中找到了解释。在第51页,他写道:
不同层上的不同组。
有时我们想根据不同的聚合级别绘制摘要。不同的层可能具有不同的组美学,因此一些层显示单个级别的数据,而另一些层显示较大组的摘要。
在上一个例子的基础上,假设我们想根据所有男孩的年龄和身高向刚刚创建的情节添加一条平滑的线。如果我们对平滑曲线使用与直线相同的分组,我们将得到图4.4中的第一个图。
p + geom_smooth(aes(group = Subject),method=“lm”,se = F)
这不是我们想要的我们无意中为每个男孩添加了一条平滑线。这个新层需要不同的组外观,组= 1,以便新线将基于所有数据,如图中的第二个图所示。修改后的图层如下所示:
p + geom_smooth(aes(group = 1),method=“lm”,size = 2,se = F)
[...]在平滑层中使用AES(组= 1)可以在所有男孩中拟合出一条最佳拟合线。

nuypyhwy

nuypyhwy2#

另一种更长的方法(如果数据在两个不同的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))

创建于2021-04-15由reprex package(v1.0.0)

Again, `group = 1` is the key.

相关问题