使用 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 = x
和 group = g
的***美学映射,因此它会计算每个 x 处的平均 y 值 为每个 g 值,导致很多水平线。将x = 1
添加到stat_summary
的映射会覆盖x = x
(同时保留group = g
),因此我们会得到每个g 值的单一平均y 值。
【讨论】:
嘿!顺便说一句,当使用 x 轴上的日期时间变量执行此操作时,设置x=1
或 x=NULL
或 x=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?