Search code examples
rplotfill

How to fill colors in some specific area in R?


Here is the problem:

x<-seq(0,10,length.out = 1000)
y1<-dnorm(x,mean = 2,sd=1)
y2<-dnorm(x,mean = 6,sd=1)
plot(x,y1,type="l")
lines(x,y2)
abline(v=x[380])

The graph is shown below. How can I fill 2 different colors, say red and blue, on the each side of vertical line but still below two normal density functions. I thought I can use polygon, but failed.

This is the graph without filling colors:

enter image description here


Solution

  • Here's one way:

    First, we'll get the parallel minimum of your densities - this is a vector of the top y coordinates for our polygons.

    y = pmin(y1, y2)
    
    # set up your plot as in the question    
    plot(x, y1, type="l")
    lines(x, y2)
    
    # define a re-usable variable for the vertical line placement
    x_vert = 380
    abline(v = x[x_vert])
    
    # Now we'll draw 2 polygons, one for the left side, one for the right.
    # The first (x,y) pairs of the polygon are just the (x,y) coords of the
    # density we're filling to, until the vertical line
    # Then we need to connect the "bottom" points, which have coordinates
    # (x[x_vert], 0) and (x[1], 0)    
    polygon(x = c(x[1:x_vert], x[x_vert], x[1]), 
            y = c(y[1:x_vert], 0, 0),
            col = "blue")
    # similar for the right hand polygon, but now going from x_vert to length(x)
    polygon(x = c(x[x_vert:length(x)], x[length(x)], x[x_vert]),
            y = c(y[x_vert:length(x)], 0, 0),
            col = "red")
    

    Voila!

    enter image description here