Это своего рода хаки sh, и может быть более чистый способ сделать это. Я собираюсь использовать набор данных радужной оболочки здесь.
library(ggplot2)
library(dplyr)
Сначала построим типовой график плотности:
p <- ggplot(iris, aes(x = Sepal.Length, colour = Species)) +
geom_density()
p
Функция ggplot_build()
позволяет получить доступ к внутренней информации графика.
p_build <- ggplot_build(p)
В этом списке есть объект data
, в котором хранятся сопоставленные координаты, полученные в результате вызова geom_density()
. Я возьму это.
p_mod <- p_build$data[[1]]
Тогда я сделаю настройку. Сначала мне нужно восстановить sh, к каким группам относятся цвета, а затем я переустанавливаю для каждого цвета значение y по желанию:
p_modded <- p_mod %>%
mutate(Species = case_when(colour == "#F8766D" ~ "setosa",
colour == "#00BA38" ~ "versicolor",
TRUE ~ "virginica")) %>%
group_by(colour) %>%
mutate(y = y / max(y)) %>%
ungroup()
А теперь новый график. Обратите внимание, что мне не нужно использовать geom_density()
, потому что плотность уже рассчитана, поэтому мне просто нужно использовать geom_line()
.
ggplot(p_modded, aes(x = x, y = y, colour = Species)) +
geom_line()
![enter image description here](https://i.stack.imgur.com/pG4GR.png)