значение y для `geom_label` в ggplot2 на основе переменной` ..count..` - PullRequest
0 голосов
/ 26 августа 2018

Я хочу создать гистограмму, где есть вертикальная линия, обозначающая среднее значение, и метка, прикрепленная к этой строке, которая дает точное значение для среднего значения.

Я могу создать базовую гистограмму с вертикальнойлегко.

# 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?

1 Ответ

0 голосов
/ 26 августа 2018

Вы можете получить текущий диапазон по оси Y от plot, заменив жестко закодированный y = 5 в своем коде на y = mean(layer_scales(plot)$y$range$range).

Таким образом, если параметры изменятся, изменениев масштабе учитывается.

# layer_scales(plot) gives the scale information for plot
> layer_scales(plot)$y
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
<ScaleContinuousPosition>
 Range:     0 --   12
 Limits:    0 --   12

# this is the actual vector for y-axis scale range
> layer_scales(plot)$y$range$range
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
[1]  0 12

# this is the y-axis midpoint value
> mean(layer_scales(plot)$y$range$range)
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
[1] 6
...