Shading the graph of the density of the nucleus between two points.

I often use kernel density plots to illustrate distributions. They quickly and easily create in R like this:

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

What gives me this nice little pdf:

enter image description here

I want to shade the area under the PDF from the 75th to the 95th percentile. Easily calculate points using the quantile function:

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

But how to obscure the area between q75 and q95 ?

+82
r plot
Aug 16 2018-10-18T00:
source share
4 answers

Using the polygon() function, see the man page, and I believe we had similar questions.

You need to find the index of the quantile values ​​to get the actual pairs (x,y) .

Edit: here you are:

 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")) 

Exit (added by JDL)

enter image description here

+65
Aug 16 '10 at 15:39
source share

Another solution:

 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) 

Result: alt text

+63
Dec 6 '10 at 22:14
source share

Expanded Solution:

If you want to shade both tails (copy and paste the Dirk code) and use the known x values:

 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")) 

Result:

2-tailed poly

+19
Mar 25 '11 at 17:53
source share

This question needs an answer lattice . Here is very simple, just adapting the method used by Dirk and others:

 #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)) 

enter image description here

+17
Aug 25 2018-11-11T00:
source share



All Articles