Установите типы и размеры линий geom_vline с помощью сопоставления aes в ggplot2 - PullRequest
0 голосов
/ 29 мая 2020

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

У меня есть данные для строк в фрейме данных:

lines
   qntls        lbs heights    lts lsz
1  29.00      p5=29 32.2400 dashed 0.1
2  45.25     p25=45 33.5296 dashed 0.1
3  79.00     p50=79 30.9504 dashed 0.1
4 128.00    p75=128 32.2400 dashed 0.1
5 249.25    p95=249 33.5296 dashed 0.1
6 120.00 Target=120 30.9504  solid 0.2

Затем я использую строки фрейм данных для создания объектов geom_vline и geom_label:

ggplot() +
  geom_histogram(
    data = h,
    mapping = aes(
      x = DAYSTODECISION
    ),
    breaks = brks,
    color = clr,
    fill = f
  ) +
  geom_vline(
    data = lines,
    mapping = aes(
      xintercept = qntls,
      color = lbs,
      linetype = lts,
      size = lsz
    ),
    show.legend = FALSE
  ) +
  geom_label(
    data = lines,
    mapping = aes(
      x = qntls,
      y = heights,
      label = lbs,
      hjust = 0 # Label starts on line and extends right
    )
  ) +
  ggtitle(title) +
  labs(
    x = xlab,
    y = ylab
  ) +
  theme_classic()

Я получаю такой результат:

enter image description here

Я хочу линия для цели должна быть solid, а все остальные линии должны быть пунктирными. По какой-то причине это перевернуто на диаграмме по сравнению с строками кадром данных. Кроме того, я ожидал бы, что целевая линия будет вдвое толще, чем другие линии, но это не так.

Любая помощь будет очень признательна!

1 Ответ

0 голосов
/ 29 мая 2020
  # your plot code ... +
  scale_linetype_identity() +
  scale_size_identity()

Для ggplot необычно помещать во фрейм данных фактические цвета / размеры / типы линий (вместо значимых меток, которые могут понадобиться в легенде, как вы делаете для lbs), но если вы сделаете масштаб identity, ваш друг.

При более стандартном подходе ваши данные будут настроены, возможно, следующим образом:

   qntls        lbs heights is_target 
1  29.00      p5=29 32.2400        no
2  45.25     p25=45 33.5296        no
3  79.00     p50=79 30.9504        no
4 128.00    p75=128 32.2400        no
5 249.25    p95=249 33.5296        no
6 120.00 Target=120 30.9504       yes

Затем сопоставьте linetype = is_target, size = is_target внутри aes() и используйте ручные шкалы, например:

... + 
scale_size_manual(values = c("no" = 0.1, "yes" = 0.2)) +
scale_linetype_manual(values = c("no" = "dashed", "yes" = "solid"))

Эта настройка позволяет легко настроить график без изменения данных.

...