# R/Contour Plots

From QERM Wiki

(Difference between revisions)

(beginning of page on contour functions in R. could benefit from additional plots & uploaded .R file) |
(added images, removed redundant code) |
||

Line 1: | Line 1: | ||

+ | [[Image:Filled_contour_bad.png | right | thumb | 300 px | Bad contour plot]] | ||

+ | |||

=Contour Plots= | =Contour Plots= | ||

R has two built-in functions for contour plots, contour, and filled.contour. Examples of their use can be seen from the code below: | R has two built-in functions for contour plots, contour, and filled.contour. Examples of their use can be seen from the code below: | ||

Line 24: | Line 26: | ||

# add this to line above and see bad match | # add this to line above and see bad match | ||

contour(x,y,z,levels=mylevels,add=T) | contour(x,y,z,levels=mylevels,add=T) | ||

+ | |||

+ | [[Image:Filled_contour_good.png | right | thumb | 300 px | Good contour plot]] | ||

A solution is to use the modified function, filled.contour2, as follows | A solution is to use the modified function, filled.contour2, as follows |

## Revision as of 23:25, 21 July 2010

# Contour Plots

R has two built-in functions for contour plots, contour, and filled.contour. Examples of their use can be seen from the code below:

x <- 1:50 y <- 1:70 z <- matrix(expand.grid(x,y)$Var1^2 + expand.grid(x,y)$Var2^2,50,70) # plain contour(x,y,z) # adjusting levels mylevels <- seq(0,7500,500) contour(x,y,z,levels=mylevels,xaxs='i',yaxs='i') # filled contours filled.contour(x,y,z,color.palette=heat.colors) filled.contour(x,y,z,col=grey(seq(0,1,length=length(mylevels)))) # add this to line above and see bad match contour(x,y,z,levels=mylevels,add=T)

However, it can be frustrating to realize that the way filled.contour was implemented does not allow removing the key or overplotting with lines and labels. To realize this, try the following:

filled.contour(x,y,z,col=grey(seq(0,1,length=length(mylevels)))) # add this to line above and see bad match contour(x,y,z,levels=mylevels,add=T)

A solution is to use the modified function, filled.contour2, as follows

# filled.contour function modified to not have key filled.contour2(x,y,z,col=grey(seq(0.3,1,length=length(mylevels)))) # now we can successfully add lines and values contour(x,y,z,levels=mylevels,add=T)

Here is the full modified function,

filled.contour2 <- function (x = seq(0, 1, length.out = nrow(z)), y = seq(0, 1, length.out = ncol(z)), z, xlim = range(x, finite = TRUE), ylim = range(y, finite = TRUE), zlim = range(z, finite = TRUE), levels = pretty(zlim, nlevels), nlevels = 20, color.palette = cm.colors, col = color.palette(length(levels) - 1), plot.title, plot.axes, key.title, key.axes, asp = NA, xaxs = "i", yaxs = "i", las = 1, axes = TRUE, frame.plot = axes,mar, ...) { # modification by Ian Taylor of the filled.contour function # to remove the key and facilitate overplotting with contour() if (missing(z)) { if (!missing(x)) { if (is.list(x)) { z <- x$z y <- x$y x <- x$x } else { z <- x x <- seq.int(0, 1, length.out = nrow(z)) } } else stop("no 'z' matrix specified") } else if (is.list(x)) { y <- x$y x <- x$x } if (any(diff(x) <= 0) || any(diff(y) <= 0)) stop("increasing 'x' and 'y' values expected") mar.orig <- (par.orig <- par(c("mar", "las", "mfrow")))$mar on.exit(par(par.orig)) w <- (3 + mar.orig[2]) * par("csi") * 2.54 par(las = las) mar <- mar.orig plot.new() par(mar=mar) plot.window(xlim, ylim, "", xaxs = xaxs, yaxs = yaxs, asp = asp) if (!is.matrix(z) || nrow(z) <= 1 || ncol(z) <= 1) stop("no proper 'z' matrix specified") if (!is.double(z)) storage.mode(z) <- "double" .Internal(filledcontour(as.double(x), as.double(y), z, as.double(levels), col = col)) if (missing(plot.axes)) { if (axes) { title(main = "", xlab = "", ylab = "") Axis(x, side = 1) Axis(y, side = 2) } } else plot.axes if (frame.plot) box() if (missing(plot.title)) title(...) else plot.title invisible() }