Я хочу создать гистограмму, где есть вертикальная линия, обозначающая среднее значение, и метка, прикрепленная к этой строке, которая дает точное значение для среднего значения.
Я могу создать базовую гистограмму с вертикальнойлегко.
# needed library
library(ggplot2)
# mean to be used later
x_mean <- mean(x = iris$Sepal.Length, na.rm = TRUE)
# creating basic plot with line for mean
(
plot <- ggplot(data = iris,
mapping = aes(x = Sepal.Length)) +
stat_bin(
col = "black",
alpha = 0.7,
na.rm = TRUE,
mapping = aes(y = ..count..,
fill = ..count..)
) +
geom_vline(
xintercept = x_mean,
linetype = "dashed",
color = "red",
na.rm = TRUE
) +
scale_fill_gradient(name = "count",
low = "white",
high = "white") +
guides(fill = FALSE)
)
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Теперь я могу добавить метку к этой строке, используя следующий код:
# adding label to the line
plot +
geom_label(mapping = aes(
label = list(bquote("mean" == ~ .(
format(round(x_mean, 2), nsmall = 2)
))),
x = x_mean,
y = 5 # how to automate this value choice?
),
parse = TRUE)
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Теперь проблема в том, что я жестко кодирую y
-значение для geom_label
(y = 5
).Это не идеально, потому что если я изменю данные, переменную или ширину бина, y = 5
больше не будет (приблизительной) серединой оси y.Я попытался установить y = max(..count..)/2
, но это приводит к следующей ошибке:
Ошибка в FUN (X [[i]], ...): объект 'count' не найден
Подводя итог: как можно автоматизировать выбор значения y
для geom_label
в этом контексте, чтобы независимо от диапазона значений метка всегда центрировалась в середине оси Y?