连接意味着在带有线的箱线图上(ggplot2)

时间:2010-10-21 17:00:14

标签: r ggplot2 boxplot

我有一个显示多个方框的箱线图。我想连接每个盒子的平均值和一条线。箱形图默认不显示均值,而中间线仅表示中位数。我试过了

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

2 个答案:

答案 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)

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

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是关键。