【问题标题】:Plot per-group means over geom_bar w在 geom_bar w 上绘制每组均值
【发布时间】:2019-06-30 01:00:54
【问题描述】:

我有一个包含三列的数据框:一个因子(这里代表书中的一章)、一个数字 ID(代表该句子在书中出现的位置)和一个值(代表书中的单词数)。它看起来像这样:

sentence.length
# A tibble: 5,368 x 3
   Chapter    ID Length
   <fct>   <dbl>  <dbl>
 1 1           1    294
 2 1           2     19
 3 1           3     77
 4 1           4     57
 5 1           5     18
 6 1           6     18
 7 1           7     27
 8 1           8     56
 9 1           9     32
10 1          10     25
# ... with 5,358 more rows

我有一个非常接近我想要的情节。

ggplot(data,aes(x=ID,y=Length,fill=Chapter)) +
  geom_bar(stat='identity') 

我想补充的是,在每个组上,都有一条代表该组平均值的水平线。

这段代码,从另一个问题修改,让我很接近

  stat_summary(fun.y = mean, aes(x = 1, yintercept = ..y.., group = Chapter), geom = "hline")

但是线条延伸到整个情节;有没有办法仅在绘图的相关部分上绘制平均线?我怀疑这里的问题是我的数据恰好是这样排序的,group 对应于绘图的连续部分;但情节本身的美学没有任何要求。

更接近的方法是不使用stat_summary,而是使用geom_smoothgeom_smooth(method='lm',se=FALSE) 让我非常接近。但不是线性回归,我真的只想要组的平均值(这里是每章句子长度的平均值)。

有更好/更简单的方法吗?

【问题讨论】:

  • 这里的 geom_segment 解决方案:stackoverflow.com/questions/36207564/… 可能就是你要找的东西
  • 谢谢@emily-kothe;我没有看到,geom_segment 是关键!下面的解决方案将它与 wrapr 的工具相结合,使其更易于阅读。

标签: r ggplot2


【解决方案1】:

我不确定这是否是最简单的方法,但它确实有效:

library(tidyverse)
library(wrapr)

df %.>%
  ggplot(data = ., aes(
    x = ID,
    y = Length,
    fill = Chapter
  )) +
  geom_col() +
  geom_segment(data = group_by(., Chapter) %>%
    summarise(
      mean_len = mean(Length),
      min_id = min(ID),
      max_id = max(ID)
    ),
    aes(
      x = min_id,
      xend = max_id,
      y = mean_len,
      yend = mean_len
    ),
    color = 'steelblue',
    size = 1.2
  )

使用%.&gt;% 管道,您可以向下传递df 以将其汇总到geom_segment 函数中。您可以在%.&gt;% 之后通过. 访问df

【讨论】:

  • 非常感谢!即使它不是最简单的,它也绝对是清晰的、表达良好的,并且避免了我所陷入的荒谬的手动计算每个平均值的游戏。
猜你喜欢
  • 2015-07-22
  • 2019-02-19
  • 2014-11-02
  • 2021-01-17
  • 2021-03-03
  • 2021-01-17
相关资源
最近更新 更多