Как заполнить график плотности в интервале с ggplot? - PullRequest
2 голосов
/ 27 января 2020

Приведенный ниже код заполняет каждую из двух плотностей цветом под областью кривой:

library(ggplot2)

#fake data
dat <- data.frame(dens = c(rnorm(100), rnorm(100, 2, 0.5))
                   , group = rep(c("C", "P"), each = 100))

#fill the area under the curve
ggplot(dat, aes(x = dens, fill = group)) + geom_density(alpha = 0.75)

Как мне достичь следующих двух целей?

1) Заполнить только каждую кривая в пределах указанного интервала. Например, интервал [-1,5, 2,0] для группы 'C' и [0,5, 2,8] для группы 'P'.

2) Добавьте вертикальный сегмент (от оси x к кривой) для каждой плотности. Например, при x = 0,2 для группы «C» и при x = 1,9 для группы «P».

1 Ответ

4 голосов
/ 27 января 2020

Чтобы вы смотрели, вот ваш первый вопрос:

library(dplyr)
library(purrr)
library(tidyr)
library(ggplot2)

as.data.frame.density <- function(x) data.frame(x = x$x, y = x$y)

densities <- dat %>% 
  group_nest(group) %>% 
  mutate(dens = map(data, ~as.data.frame(density(.$dens)))) %>% 
  unnest(dens)

ggplot(densities, aes(x = x, y = y, group = group)) + 
  geom_density(stat = 'identity') +
  geom_density(
    aes(fill = group),
    . %>% filter((group == "C" & between(x, -1.5, 2.0)) | (group == "P" & between(x, 0.5, 2.8))),
    stat = 'identity',
    alpha = 0.75
  )

enter image description here

Существуют и другие способы расчета плотности на группу, используя dplyr это только один путь. Вероятно, было бы хорошо установить равную полосу пропускания для двух оценок плотности.

Добавление сегментов аналогично этому подходу, вам просто нужно найти правильные значения в densities data.frame.

...