r语言 - 使用facet wrap在ggplot中添加具有绘制点平均值的线



我正在处理一个数据框架,其中包含每个人在不同日期进行的中心明智销售。示例数据可以生成如下

library(tidyverse)
tibble(
centre = rep(c('A', 'B'), 4),
person = c('p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7', 'p8')
) %>%
full_join(
tibble(date = seq(as.Date('2022-01-01'), as.Date('2022-01-5'), 1)),
by = character()
) %>%
mutate(
num = round(runif(nrow(.), min = 50, max = 100),0)
) ->
df

我正在尝试绘制不同人的销售与日期的趋势,如下所示

library(ggplot2)
df %>%
group_by(centre, person) %>%
mutate(mean_num = mean(num, na.rm = TRUE)) %>%
ungroup() %>%
ggplot(aes(x = date, y = num)) +
geom_point() +
geom_line() +
facet_wrap(~person, scales = 'free') +
xlab('Date') +
ylab('Sales') +
ggtitle('Sales vs Date') ->
plt

我想在每个方面加上该方面的平均值(即每个人的销售额的平均值)。我试过三种方法,但似乎都不起作用。方法3从下面的链接添加平均线到ggplot?

# Method 1
plt +
geom_hline(yintercept = mean(num), linetype = 'dotted', colour = 'red')
# Method 2
plt +
geom_hline(yintercept = mean_num, linetype = 'dotted', colour = 'red')
# Method 3
plt +
stat_summary(fun = mean, geom = 'line', colour = 'red')

我可以为手段做一个单独的数据框架,然后用它来绘图,但想在一个管道中做。我做错了什么吗?

您需要将yintercept作为美学映射传递:

plt +
geom_hline(aes(yintercept = mean_num), linetype = 'dotted', colour = 'red')

当前拥有的代码正在全局环境中查找mean_num的单个值。通过将aes(yintercept = mean_num)传递给geom_hlinemapping参数,您可以向ggplot明确表示您希望使用df中的变量并将其分别映射到每个facet。

最新更新