按组绘制均值表示通过

时间:2019-02-06 05:59:11

标签: r ggplot2

我有一个包含三列的数据框:一个因数(在这里代表书中的一章),一个数字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') 

A ggplot plot

我想添加的是,在每个组中,一条水平线代表该组的平均值。

此代码经过另一个问题的修改,使我与世隔绝

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

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

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

ggplot using geom_smooth

是否有更好/更简单的方法?

1 个答案:

答案 0 :(得分:1)

我不确定这是否是最简单的方法,但是它可以工作:

enter image description here

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
  )

使用%.>%管道,您可以向下传递df以在geom_segment函数中对其进行汇总。您可以通过df%.>%之后访问.