繁体   English   中英

用geom_bar和stat =“ identity”在平均值处绘制hline

[英]Plot hline at mean with geom_bar and stat=“identity”

我有一个条形图,其中确切的条形高度在数据框中。

df <- data.frame(x=LETTERS[1:6], y=c(1:6, 1:6 + 1), g=rep(x = c("a", "b"), each=6))

ggplot(df, aes(x=x, y=y, fill=g, group=g)) + 
  geom_bar(stat="identity", position="dodge")

在此处输入图片说明

现在,我要添加两个 hline,以显示每组所有条形的平均值。 我所拥有的

ggplot(df, aes(x=x, y=y, fill=g, group=g)) + 
  geom_bar(stat="identity", position="dodge") +
  stat_summary(fun.y=mean, aes(yintercept=..y.., group=g), geom="hline")

在此处输入图片说明

因为我也想对任意数量的组执行此操作,所以我只希望使用ggplot解决方案。

我想避免这样的解决方案,因为它不完全依赖传递给ggplot的数据集,具有冗余代码并且在组数方面不灵活:

ggplot(df, aes(x=x, y=y, fill=g, group=g)) + 
  geom_bar(stat="identity", position="dodge") +
  geom_hline(yintercept=mean(df$y[df$g=="a"]), col="red") +
  geom_hline(yintercept=mean(df$y[df$g=="b"]), col="green")

提前致谢!

编辑:

  • 添加数据集
  • 评论结果代码
  • 更改数据和绘图以澄清问题

如果我正确理解您的问题,那么您的第一种方法就差不多了:

ggplot(df, aes(x = x, y = y, fill = g, group = g)) + 
  geom_col(position="dodge") + # geom_col is equivalent to geom_bar(stat = "identity")
  stat_summary(fun.y = mean, aes(x = 1, yintercept = ..y.., group = g), geom = "hline")

情节

根据stat_summary的帮助文件:

stat_summary对唯一的x进行操作; ...

在这种情况下, stat_summary继承了x = xgroup = g的顶级美学映射,因此它将为g的每个值计算每个x的平均y值,从而导致许多水平线。 stat_summary的映射中添加x = 1会覆盖x = x (同时保留group = g ),因此对于g的每个值,我们得到一个均值y值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM