Установите типы и размеры линий geom_vline с отображением aes в ggplot2

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

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

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

Затем я использую фрейм данных lines для создания объектов 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()

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

введите здесь описание изображения

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

Любая помощь приветствуется!


person TomAdair    schedule 29.05.2020    source источник


Ответы (1)


  # 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"))

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

person Gregor Thomas    schedule 29.05.2020