Le code ci-dessous remplit chacune des deux densités de couleur sous la zone de la courbe :

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)

Comment puis-je atteindre les deux objectifs suivants ?

1) Ne remplissez chaque courbe que dans un intervalle spécifié. Par exemple, intervalle [-1,5, 2,0] pour le groupe 'C' et [0,5, 2,8] pour le groupe 'P'.

2) Ajoutez un segment vertical (de l'axe des x à la courbe) pour chaque densité. Par exemple, à x=0,2 pour le groupe 'C' et à x=1,9 pour le groupe 'P'.

2
bluepole 27 janv. 2020 à 20:42

1 réponse

Meilleure réponse

Pour vous aider, voici votre première question :

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

Il existe d'autres façons de calculer les densités par groupe, l'utilisation de dplyr n'est qu'une façon. Il est probablement bon de définir une bande passante égale aux deux estimations de densité.

L'ajout des segments est similaire à cette approche, il vous suffit de trouver les valeurs correctes dans le data.frame densities.

4
Axeman 27 janv. 2020 à 21:54