Sombreando un gráfico de densidad del núcleo entre dos puntos.

Resuelto JD Long asked hace 54 años • 5 respuestas

Con frecuencia utilizo gráficos de densidad del núcleo para ilustrar las distribuciones. Estos son fáciles y rápidos de crear en R así:

set.seed(1)
draws <- rnorm(100)^2
dens <- density(draws)
plot(dens)
#or in one line like this: plot(density(rnorm(100)^2))

Lo que me da este pequeño y agradable PDF:

ingrese la descripción de la imagen aquí

Me gustaría sombrear el área debajo del PDF desde los percentiles 75 al 95. Es fácil calcular los puntos usando la quantilefunción:

q75 <- quantile(draws, .75)
q95 <- quantile(draws, .95)

Pero, ¿cómo sombreo el área entre q75y q95?

JD Long avatar Jan 01 '70 08:01 JD Long
Aceptado

Con la polygon()función, consulte su página de ayuda y creo que aquí también tuvimos preguntas similares.

Necesita encontrar el índice de los valores cuantiles para obtener los (x,y)pares reales.

Editar: Aquí tienes:

x1 <- min(which(dens$x >= q75))  
x2 <- max(which(dens$x <  q95))
with(dens, polygon(x=c(x[c(x1,x1:x2,x2)]), y= c(0, y[x1:x2], 0), col="gray"))

Salida (agregada por JDL)

ingrese la descripción de la imagen aquí

Dirk is no longer here avatar Aug 16 '2010 15:08 Dirk is no longer here

Otra solución:

dd <- with(dens,data.frame(x,y))

library(ggplot2)

qplot(x,y,data=dd,geom="line")+
  geom_ribbon(data=subset(dd,x>q75 & x<q95),aes(ymax=y),ymin=0,
              fill="red",colour=NA,alpha=0.5)

Resultado:

texto alternativo

Ben Bolker avatar Dec 06 '2010 22:12 Ben Bolker

Una solución ampliada:

Si desea sombrear ambas colas (copiar y pegar el código de Dirk) y utilizar valores de x conocidos:

set.seed(1)
draws <- rnorm(100)^2
dens <- density(draws)
plot(dens)

q2     <- 2
q65    <- 6.5
qn08   <- -0.8
qn02   <- -0.2

x1 <- min(which(dens$x >= q2))  
x2 <- max(which(dens$x <  q65))
x3 <- min(which(dens$x >= qn08))  
x4 <- max(which(dens$x <  qn02))

with(dens, polygon(x=c(x[c(x1,x1:x2,x2)]), y= c(0, y[x1:x2], 0), col="gray"))
with(dens, polygon(x=c(x[c(x3,x3:x4,x4)]), y= c(0, y[x3:x4], 0), col="gray"))

Resultado:

poli de 2 colas

Milktrader avatar Mar 25 '2011 17:03 Milktrader