我有一个包含三列的数据框:一个因数(在这里代表书中的一章),一个数字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_smooth
; geom_smooth(method='lm',se=FALSE)
让我非常接近。但是,除了线性回归之外,我真的只想要该组的均值(此处是每章句子长度的均值)。
是否有更好/更简单的方法?
答案 0 :(得分: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
)
使用%.>%
管道,您可以向下传递df
以在geom_segment
函数中对其进行汇总。您可以通过df
在%.>%
之后访问.
。