我有一个显示多个方框的箱线图。我想连接每个盒子的平均值和一条线。箱形图默认不显示均值,而中间线仅表示中位数。我试过了
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
答案 0 :(得分:30)
这就是你要找的东西吗?
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.y=mean, geom="line", aes(group=1)) +
stat_summary(fun.y=mean, geom="point")
更新:
关于设置组= 1的一些说明:我认为我在Hadley Wickham的书“ggplot2: Elegant Graphics for Data Analysis”中找到了解释。在第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(group = 1) 平滑层适合单行 最适合所有男孩。“
答案 1 :(得分:0)
另一种较长的方法(如果数据位于两个不同的dataframes中)是:
library(dplyr); library(ggplot2)
x <- factor(rep(1:10, 100)); y <- rnorm(1000);
df <- data.frame(x=x, y=y);
df_for_line <- 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))
同样,group = 1
是关键。