[R] continuous coloring of a polygon

Earl F. Glynn efg at stowers-institute.org
Fri Aug 15 18:23:33 CEST 2008

"Roger Leenders" <r.t.a.j.leenders at rug.nl> wrote in message 
news:48A56FE6.60304 at rug.nl...

> Now I want to fill the polygon with color, such that it starts on the left 
> with red and ends on the right with green, following the coloring of the 
> rainbow.

I'd recommend using polar coordinates, like shown below.

Instead of 2000 points, 200 or even 100 seem to be enough.

Break your arc (polygon) into smaller trapezoids and color them with a 
continuously changing palette:

red.to.green <- rainbow(N, start=0, end=0.35))

N <- 200  # points used for a full circle

radius <- 3
theta <- seq(0.0, 2*pi, length.out=N)

# Plot circle
plot(radius*cos(theta), radius*sin(theta),
     type="l", ylab="", xlab="", axes=F)

# Break arc into filled trapezoids

radius.outer <- 2.7
radius.inner <- 2.0

N2 <- N / 2
theta <- seq(pi, 0.0, length.out=N/2)

red.to.green <- rainbow(N2, start=0, end=0.35)

for (i in 1:(N2-1))
  x1 <- radius.outer*cos(theta[i])
  x2 <- radius.outer*cos(theta[i+1])
  x3 <- radius.inner*cos(theta[i+1])
  x4 <- radius.inner*cos(theta[i])

  y1 <- radius.outer*sin(theta[i])
  y2 <- radius.outer*sin(theta[i+1])
  y3 <- radius.inner*sin(theta[i+1])
  y4 <- radius.inner*sin(theta[i])

  polygon( c(x1, x2, x3, x4, x1),
           c(y1, y2, y3, y4, y1), col=red.to.green[i], border=NA)

# Draw outline of arc

x.outer <- radius.outer * cos(theta)
y.outer <- radius.outer * sin(theta)

x.inner <- radius.inner * cos(theta)
y.inner <- radius.inner * sin(theta)

polygon(c(x.outer, rev(x.inner), x.outer[1] ),
        c(y.outer, rev(y.inner), y.outer[1] ) )


Earl F Glynn
Stowers Institute for Medical Reseach

More information about the R-help mailing list