varias superponer studio modificar lineas graficos graficas ejes r plot

superponer - Sombreando un gráfico de densidad de kernel entre dos puntos.



superponer graficas en r (4)

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

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

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)

Frecuentemente uso diagramas de densidad del kernel para ilustrar las distribuciones. Estos son fáciles y rápidos de crear en R así que:

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 bonito PDF:

Me gustaría sombrear el área debajo del PDF del percentil 75 al 95. Es fácil calcular los puntos usando la función de quantile :

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

¿Pero cómo sombreo el área entre q75 y q95 ?


Esta pregunta necesita una respuesta lattice . Aquí hay uno muy básico, simplemente adaptando el método empleado por Dirk y otros:

#Set up the data set.seed(1) draws <- rnorm(100)^2 dens <- density(draws) #Put in a simple data frame d <- data.frame(x = dens$x, y = dens$y) #Define a custom panel function; # Options like color don''t need to be hard coded shadePanel <- function(x,y,shadeLims){ panel.lines(x,y) m1 <- min(which(x >= shadeLims[1])) m2 <- max(which(x <= shadeLims[2])) tmp <- data.frame(x1 = x[c(m1,m1:m2,m2)], y1 = c(0,y[m1:m2],0)) panel.polygon(tmp$x1,tmp$y1,col = "blue") } #Plot xyplot(y~x,data = d, panel = shadePanel, shadeLims = c(1,3))


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:


Una solución expandida:

Si quería sombrear ambas colas (copiar y pegar del código de Dirk) y usar valores 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: