Установите типы и размеры линий 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()

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

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

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

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

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

Другие вопросы по тегам