Как добавить geom_segment в geom_de density_ridges_gradient?

Я хотел бы добавить вертикальные сегменты к линейному графику, гистограммы которого показывают настроенные квантили.

Мне удалось получить вертикальные сегменты, если сопоставить цвет заливки с ..x... Но я бы хотел показать квантили на графиках плотности. Я написал следующий код:

library(datasets)
library(ggplot2)
data("iris")

iris_lines <- data.frame(Species = c("setosa", "versicolor", "virginica"),
                         x0 = c(5, 5.9, 6.5))

Figure1 <- ggplot(iris, aes(x=Sepal.Length, y=Species, fill=(..quantile..))) +
  geom_density_ridges_gradient(jittered_points = FALSE, calc_ecdf = TRUE, quantile_lines = c(TRUE), quantiles =c(0.1,0.25,0.75,0.9),scale=0.9, color='white')+
  geom_segment(data = iris_lines, aes(x = x0, xend = x0, y = as.numeric(Species), yend = as.numeric(Species) + c(.9,.5,.5)), color = "red") + scale_y_discrete(expand = c(0.01, 0))
Figure1

Код работает, если я отображаю цвет заливки как fill = ..x... Я получаю три вертикальные линии, представляющие среднее значение каждого графика плотности; однако, если я сопоставлю цвет заливки как fill = ..quantile.., я получу следующую ошибку:

Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 1, 3

person Andres    schedule 18.06.2019    source источник
comment
Добро пожаловать в SO. Из вашего комментария к ответу ниже я полагаю, что ответ был полезным. Пожалуйста, найдите время, чтобы отметить ответ как полезный, проголосовав за него и / или отметив его как правильный ответ.   -  person KoenV    schedule 18.06.2019


Ответы (1)


Хороший график!

Добавьте inherit.aes = F ко второй геометрии, чтобы она не пыталась сопоставить ваши данные с расчетом заполнения в вызове ggplot(aes().

Figure1 <- ggplot(iris, aes(x=Sepal.Length, y=Species, fill=(..quantile..))) +
      geom_density_ridges_gradient(jittered_points = FALSE, 
                                   calc_ecdf = TRUE, 
                                   quantile_lines = c(TRUE), 
                                   quantiles =c(0.1,0.25,0.75,0.9),
                                   scale=0.9, color='white') +
      geom_segment(data = iris_lines, 
                   aes(x = x0, xend = x0, 
                       y = as.numeric(Species), yend = as.numeric(Species) + c(.9,.5,.5)),
                   color = "red", inherit.aes = F) +   #### HERE ####
      scale_y_discrete(expand = c(0.01, 0))
Figure1

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


Редактировать:

OP спросил в комментарии о выборочной маркировке некоторых элементов и добавлении метки для средней линии. Вот подход, наверное, не самый содержательный.

Figure1 <- ggplot(iris, aes(x=Sepal.Length, y=Species, 
                            fill = (..quantile..), 
                            color = (..quantile..))) +
  geom_density_ridges_gradient(jittered_points = FALSE, 
                               calc_ecdf = TRUE, 
                               quantile_lines = c(TRUE), 
                               quantiles =c(0.1,0.25,0.75,0.9),
                               scale=0.9, color='white') +
  geom_segment(data = iris_lines, 
               aes(x = x0, xend = x0, fill = "median",
                   y = as.numeric(Species), 
                   yend = as.numeric(Species) + c(.9,.5,.5),
                   color = "median")) +   #### HERE ####
  scale_y_discrete(expand = c(0.01, 0)) +

  scale_color_manual(name = "quantile",
                     limits = c(1:3, "median"),
                     values = alpha("firebrick1", c(0, 0, 0, 1)),
                     labels = c("<10%", "10-25%", "IQR", "median")) +
  scale_fill_manual(name = "quantile",
    limits = c(1:3, "median"),
    values = c("cadetblue", "coral", "orange", "white"), 
    na.value = "gray30",
    labels = c("<10%", "10-25%", "IQR", "median"))
Figure1

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

person Jon Spring    schedule 18.06.2019
comment
Джон, я застрял на несколько дней, большое спасибо за помощь! Я не знал о inherit.aes. Небольшой вопрос по этикетке. Можно ли показать только первые три элемента метки и добавить четвертый элемент для вертикальных красных линий? - person Andres; 18.06.2019
comment
Это возможно, но я не знаю простого способа. См. Отредактированный ответ, чтобы узнать, как использовать ручные весы. Обратите внимание, что шкалы заливки и цвета должны иметь общее имя, чтобы они отображались на комбинированной основе. - person Jon Spring; 18.06.2019