使用 geom_bar 和 stat="identity" 在均值处绘制 hline

Posted

技术标签:

【中文标题】使用 geom_bar 和 stat="identity" 在均值处绘制 hline【英文标题】:Plot hline at mean with geom_bar and stat="identity" 【发布时间】:2019-02-19 04:06:23 【问题描述】:

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

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")

现在我想添加 两条 水平线来显示每组所有条形的平均值。我得到的一切

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()+geom_bar() 的命令吗?还是什么? 抱歉,忘记添加数据集。我想要一个像 ggplot() + geom_bar() + stat_summary(geom="hline") 这样的解决方案 【参考方案1】:

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

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 的***美学映射,因此它会计算每个 x 处的平均 y 值 为每个 g 值,导致很多水平线。将x = 1 添加到stat_summary 的映射会覆盖x = x(同时保留group = g),因此我们会得到每个g 值的单一平均y 值。

【讨论】:

嘿!顺便说一句,当使用 x 轴上的日期时间变量执行此操作时,设置 x=1x=NULLx=lubridate::today() 都会导致 Error: Invalid input: time_trans works with objects of class POSIXct only。有什么想法吗? x=as.Posixct("2020-01-01")替换x=1 甚至更好:将x=1替换为mean(.data[[x]],na.rm=TRUE),这样参考点就在您的数据范围内

以上是关于使用 geom_bar 和 stat="identity" 在均值处绘制 hline的主要内容,如果未能解决你的问题,请参考以下文章

如何在时间序列图中使用 geom_bar stat="identity" 设置 Bin Width?

ggplot2 中带有 geom_bar() 的回归线

使用 stat=summary 将标签添加到条形图

geom_bar(position = "dodge") 中条的宽度相同

ggplot2之颜色设置

ggplot2绘制柱形图(2)