Установите типы и размеры линий 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"))
Эта настройка позволяет легко настроить график без изменения данных.