Created
April 21, 2015 02:46
-
-
Save jeffreyhanson/b2c16ad6922fb7c7ba0d to your computer and use it in GitHub Desktop.
generic geoplotting functions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # load deps | |
| library(rgdal) | |
| library(raster) | |
| library(data.table) | |
| library(rgeos) | |
| library(tools) | |
| library(RColorBrewer) | |
| library(dplyr) | |
| library(shape) | |
| plotRaster=function(x, col, add = FALSE, legend = TRUE, horizontal = FALSE, | |
| legend.shrink = 0.5, legend.width = 0.6, legend.mar = ifelse(horizontal, | |
| 3.1, 5.1), legend.lab = NULL, graphics.reset = FALSE, | |
| bigplot = NULL, smallplot = NULL, legend.only = FALSE, lab.breaks = NULL, | |
| axis.args = NULL, legend.args = NULL, interpolate = FALSE, | |
| box = TRUE, breaks = NULL, zlim = NULL, zlimcol = NULL, fun = NULL, | |
| asp, colNA = NA, ...) { | |
| ffun <- NULL | |
| if (is.character(fun)) { | |
| if (fun %in% c("sqrt", "log")) { | |
| if (fun == "sqrt") { | |
| ffun <- fun | |
| fun <- sqrt | |
| } | |
| else { | |
| ffun <- fun | |
| fun <- log | |
| } | |
| } | |
| else { | |
| fun - NULL | |
| } | |
| } | |
| else { | |
| fun <- NULL | |
| } | |
| if (missing(asp)) { | |
| if (isLonLat(x)) { | |
| ym <- mean(c(x@extent@ymax, x@extent@ymin)) | |
| asp <- 1/cos((ym * pi)/180) | |
| } | |
| else { | |
| asp <- 1 | |
| } | |
| } | |
| e <- as.vector(t(bbox(extent(x)))) | |
| x <- as.matrix(x) | |
| if (!is.null(fun)) { | |
| x <- fun(x) | |
| } | |
| x[is.infinite(x)] <- NA | |
| if (!is.null(zlim)) { | |
| if (!is.null(zlimcol)) { | |
| x[x < zlim[1]] <- zlim[1] | |
| x[x > zlim[2]] <- zlim[2] | |
| } | |
| else { | |
| x[x < zlim[1] | x > zlim[2]] <- NA.com/ | |
| } | |
| } | |
| w <- getOption("warn") | |
| options(warn = -1) | |
| if (is.null(breaks)) { | |
| zrange <- range(x, zlim, na.rm = TRUE) | |
| } | |
| else { | |
| zrange <- range(x, zlim, breaks, na.rm = TRUE) | |
| } | |
| options(warn = w) | |
| if (!is.finite(zrange[1])) { | |
| legend <- FALSE | |
| } | |
| else { | |
| x <- raster:::.asRaster(x, col, breaks, zrange, colNA) | |
| } | |
| old.par <- par(no.readonly = TRUE) | |
| if (add) { | |
| big.plot <- old.par$plt | |
| } | |
| if (legend.only) { | |
| graphics.reset <- TRUE | |
| } | |
| if (is.null(legend.mar)) { | |
| legend.mar <- ifelse(horizontal, 3.1, 5.1) | |
| } | |
| # temp <- .imageplotplt(add = add, legend.shrink = legend.shrink, | |
| # legend.width = legend.width, legend.mar = legend.mar, | |
| # horizontal = horizontal, bigplot = bigplot, smallplot = smallplot) | |
| # smallplot <- temp$smallplot | |
| # bigplot <- temp$bigplot | |
| rasterImage(x, e[1], e[3], e[2], e[4], interpolate = interpolate) | |
| } | |
| singleMapFun=function(rast, studyareaSHP=NULL, basemapSHP=NULL, pointsSHP=NULL, linesSHP=NULL, palname=NULL, revpal=FALSE, digit=NULL, cols=NULL, centreCols=FALSE, main=NULL, path=NULL, ncols=100, maxpixels=ncell(rast), res="low", letter=NULL, colScale="quantile") { | |
| # generate colors | |
| if (!is.null(palname)) { | |
| cols=brewer.pal(brewer.pal.info[palname,"maxcolors"], palname) | |
| if (revpal) { | |
| cols=rev(cols) | |
| } | |
| } else if (!is.null(cols)) { | |
| cols=rgb(colorRamp(c("blue", "red", "orange", "yellow"))(seq(0, 1, length.out=ncols)), maxColorValue=255) | |
| } else { | |
| cols=rgb(colorRamp(c("white", "black"))(seq(0, 1, length.out=ncols)), maxColorValue=255) | |
| } | |
| # calculate color breaks | |
| if (colScale=="quantile") { | |
| # generate quantile-based brks | |
| brks=as.numeric(quantile(rast, probs=seq(0,1,length.out=length(cols)))) | |
| for (i in seq_along(brks)[-1]) { | |
| if (brks[i]==brks[1]) { | |
| brks[i]=brks[i-1]+1e-05 | |
| } | |
| } | |
| } else { | |
| # generate linear-based brks | |
| if (!centreCols) { | |
| brks=seq(cellStats(rast, "min"), cellStats(rast, "max"), length.out=length(cols)) | |
| } else { | |
| mid=ceiling(length(cols)/2) | |
| first=1 | |
| last=length(cols) | |
| brks=numeric(length(cols)) | |
| brks[first:mid]=seq(cellStats(rast, "min"), 0, length.out=length(first:mid)) | |
| brks[mid:last]=seq(0, cellStats(rast, "max"), length.out=length(mid:last)) | |
| } | |
| } | |
| # set parameters if plot is saved at high or low resolution | |
| if (res=="high") { | |
| par(cex.lab=0.5, cex.main=1) | |
| res=500 | |
| height=8 | |
| width=8 | |
| units="cm" | |
| } else { | |
| par(cex.lab=0.5, cex.main=1) | |
| res=100 | |
| height=8 | |
| width=8 | |
| units="cm" | |
| } | |
| # sink plot to file if path supplied | |
| if (!is.null(path)) { | |
| do.call(file_ext(path), args=list(file=path, height=height, width=width, res=res, units=units)) | |
| } | |
| if (!is.null(main) && nchar(main)>0) { | |
| # set plotting window | |
| layout(matrix(c(1,1,3,2),ncol=2,nrow=2,byrow=TRUE), height=c(0.1, 0.9), width=c(0.9,0.3)) | |
| # make figure title | |
| par(mar=c(0.1,0.1,0.1,0.1)) | |
| plot(1, xlab="", ylab="", main="", bty="n", type="n", axes=FALSE) | |
| mtext(side=1, at=1, text=main, line=-1) | |
| } else { | |
| # set plotting window | |
| layout(matrix(c(2,1),ncol=2,nrow=1,byrow=TRUE), height=c(1, 1), width=c(0.9,0.3)) | |
| } | |
| # make color legend | |
| par(mar=c(0.1,0.1,0.1,0.1)) | |
| plot(1, xlab="", ylab="", main="", bty="n", type="n", axes=FALSE) | |
| if (is.null(letter)) { | |
| posy=c(0.1, 0.9) | |
| } else { | |
| posy=c(0.05, 0.8) | |
| } | |
| if(is.null(digit)) | |
| digit=ifelse(maxval>1, 0, 1) | |
| if (colScale=='linear') { | |
| legValues=pretty(brks) | |
| legValues=legValues[which(legValues > min(brks) & legValues < max(brks))] | |
| shape::colorlegend(zlim=c(min(brks), max(brks)), digit=digit, col=cols, zval=legValues, posx=c(0.3, 0.4), posy = posy, xpd=TRUE) | |
| } else { | |
| legValues=pretty(seq(0,1,length.out=length(cols))) | |
| legValues=legValues[which(legValues >= 0 & legValues <= 1)] | |
| labValues=as.numeric(quantile(rast, probs=legValues)) | |
| colorlegend(zlim=c(0,1), digit=digit, col=cols, zval=legValues, zlabel=labValues, posx=c(0.3, 0.4), posy = posy , xpd=TRUE) | |
| } | |
| # add letter | |
| if (!is.null(letter)) | |
| mtext(side=3, text=paste0('(', letter, ')'), line=-2, at=par()$usr[1]+(abs(diff(par()$usr[1:2]))*0.325), cex=1.5) | |
| # geoplot | |
| par(mar=c(0.5,0.5,0.5,0.5)) | |
| if (!is.null(studyareaSHP)) { | |
| xlimit=studyareaSHP@bbox[1,] | |
| ylimit=studyareaSHP@bbox[2,] | |
| } else { | |
| xlimit=c(xmin(rast), xmax(rast)) | |
| ylimit=c(ymin(rast), ymax(rast)) | |
| } | |
| plot(1, xlim=xlimit, ylim=ylimit, type="n", axes=FALSE, bty="n") | |
| if (!is.null(basemapSHP)) { | |
| plot(basemapSHP, col="grey80", border="grey90", add=TRUE) | |
| } | |
| plotRaster(rast, col=cols, maxpixels=maxpixels, breaks=brks, legend=FALSE, box=FALSE, axes=FALSE, bty="n", main=main, add=TRUE) | |
| if (!is.null(linesSHP)) { | |
| lines(linesSHP, lwd=1.5, col='black') | |
| } | |
| if (!is.null(pointsSHP)) { | |
| points(pointsSHP, col='black', cex=1.2, pch=16) | |
| } | |
| if (!is.null(basemapSHP)) { | |
| plot(basemapSHP, border="black", add=TRUE) | |
| } | |
| # close plotting device if saving to file | |
| if (!is.null(path)) { | |
| dev.off() | |
| } | |
| } | |
| dualMapFun=function(rast1, rast2, studyareaSHP=NULL, basemapSHP=NULL, palname=NULL, revpal=FALSE, digit=NULL, cols=NULL, centreCols=FALSE, main=NULL, path=NULL, res="high", ncols=100, maxpixels=100000, ptsLIST=NULL, ptsCols=NULL, letter=NULL) { | |
| # generate colors | |
| if (!is.null(palname)) { | |
| cols=brewer.pal(brewer.pal.info[palname,"maxcolors"], palname) | |
| if (revpal) { | |
| cols=rev(cols) | |
| } | |
| } else if (!is.null(cols)) { | |
| cols=rgb(colorRamp(cols)(seq(0, 1, length.out=ncols)), maxColorValue=255) | |
| } else { | |
| cols=rgb(colorRamp(c("white", "black"))(seq(0, 1, length.out=ncols)), maxColorValue=255) | |
| } | |
| # generate brks using linear color scale | |
| maxval=max(cellStats(rast1, "max"), cellStats(rast2, "max")) | |
| minval=max(cellStats(rast1, "min"), cellStats(rast2, "min")) | |
| if (!centreCols) { | |
| brks=seq(minval, maxval, length.out=length(cols)) | |
| } else { | |
| mid=ceiling(length(cols)/2) | |
| first=1 | |
| last=length(cols) | |
| brks=numeric(length(cols)) | |
| brks[first:mid]=seq(minval, 0, length.out=length(first:mid)) | |
| brks[mid:last]=seq(0, maxval, length.out=length(mid:last)) | |
| } | |
| # set parameters if plot is saved at high or low resolution | |
| if (res=="high") { | |
| par(cex.lab=0.5, cex.main=1) | |
| res=500 | |
| height=8 | |
| width=17 | |
| units="cm" | |
| } else { | |
| par(cex.lab=0.5, cex.main=1) | |
| res=100 | |
| height=8 | |
| width=8 | |
| units="cm" | |
| } | |
| # sink plot to file if path supplied | |
| if (!is.null(path)) { | |
| do.call(file_ext(path), args=list(file=path, height=height, width=width, res=res, units=units)) | |
| } | |
| # set plotting window | |
| layout(matrix(c(2,3,1),ncol=3,nrow=1,byrow=TRUE), width=c(1,1,0.3)) | |
| # make color legend | |
| par(mar=c(0.1,0.1,0.1,0.1)) | |
| plot(1, xlab="", ylab="", main="", bty="n", type="n", axes=FALSE) | |
| if (is.null(digit)) | |
| digit=felse(maxval>1, 0, 1) | |
| legValues=pretty(brks) | |
| legValues=legValues[which(legValues > min(brks) & legValues < max(brks))] | |
| shape::colorlegend(zlim=c(min(brks), max(brks)), digit=digit, col=cols, zval=legValues, posx=c(0.4, 0.5), posy = c(0.1, 0.9), xpd=TRUE) | |
| # set plotting variables | |
| if (!is.null(studyareaSHP)) { | |
| xlimit=studyareaSHP@bbox[1,] | |
| ylimit=studyareaSHP@bbox[2,] | |
| } else { | |
| xlimit=c(min(xmin(rast1), xmin(rast2)), max(xmax(rast1), xmax(rast2))) | |
| ylimit=c(min(ymin(rast1), ymin(rast2)), max(ymax(rast1), ymax(rast2))) | |
| } | |
| # geoplot rast 1 | |
| par(mar=c(0.5,0.5,0.5,0.5)) | |
| plot(1, xlim=xlimit, ylim=ylimit, type="n", axes=FALSE, bty="n") | |
| if (!is.null(basemapSHP)) { | |
| plot(basemapSHP, col="grey80", border="black", add=TRUE, lwd=10) | |
| } | |
| plotRaster(rast1, col=cols, maxpixels=maxpixels, breaks=brks, legend=FALSE, box=FALSE, axes=FALSE, ann=F, asp=1, bty="n", main=main, add=TRUE) | |
| if (!is.null(ptsLIST)) {Map(points, ptsLIST, col=ptsCols)} | |
| mtext(side=3, text=main[1], line=-1) | |
| # geoplot rast 2 | |
| plot(1, xlim=xlimit, ylim=ylimit, type="n", axes=FALSE, bty="n") | |
| if (!is.null(basemapSHP)) { | |
| plot(basemapSHP, col="grey80", border="grey90", add=TRUE) | |
| } | |
| plotRaster(rast2, col=cols, maxpixels=maxpixels, breaks=brks, legend=FALSE, box=FALSE, axes=FALSE, bty="n", main=main, add=TRUE) | |
| if (!is.null(ptsLIST)) {Map(points, ptsLIST, col=ptsCols)} | |
| mtext(side=3, text=main[2], line=-1) | |
| # close plotting device if saving to file | |
| if (!is.null(path)) { | |
| dev.off() | |
| } | |
| } | |
| colorlegend=function (col = femmecol(100), zlim, zlevels = 5, dz = NULL, | |
| zval = NULL, zlabel = LL, log = FALSE, posx = c(0.9, 0.93), posy = c(0.05, | |
| 0.9), main = NULL, main.cex = 1, main.col = "black", | |
| lab.col = "black", digit = 0, left = FALSE, ...) | |
| { | |
| ncol <- length(col) | |
| par(new = TRUE) | |
| omar <- nmar <- par("mar") | |
| nmar[c(2, 4)] <- 0 | |
| par(mar = nmar) | |
| shape:::emptyplot() | |
| pars <- par("usr") | |
| dx <- pars[2] - pars[1] | |
| xmin <- pars[1] + posx[1] * dx | |
| xmax <- pars[1] + posx[2] * dx | |
| dy <- pars[4] - pars[3] | |
| ymin <- pars[3] + posy[1] * dy | |
| ymax <- pars[3] + posy[2] * dy | |
| if (!is.null(zval)) { | |
| zz <- zval | |
| dz <- NULL | |
| } | |
| if (is.null(dz) & is.null(zval)) | |
| if (!is.null(zlevels)) { | |
| if (log) { | |
| zz <- 10^(pretty(log10(zlim), n = (zlevels + | |
| 1))) | |
| } | |
| else zz <- pretty(zlim, n = (zlevels + 1)) | |
| } | |
| else zz <- NULL | |
| if (!is.null(dz)) { | |
| if (log) | |
| zz <- 10^(seq(log10(zlim[1]), log10(zlim[2]), by = dz)) | |
| if (!log) | |
| zz <- seq(zlim[1], zlim[2], by = dz) | |
| } | |
| if (log) { | |
| zlim <- log10(zlim) | |
| if (!is.null(zz)) | |
| zz <- log10(zz) | |
| } | |
| zmin <- zlim[1] | |
| zmax <- zlim[2] | |
| Y <- seq(ymin, ymax, length.out = ncol + 1) | |
| rect(xmin, Y[-(ncol + 1)], xmax, Y[-1], col = col, border = NA) | |
| rect(xmin, ymin, xmax, ymax, border = lab.col) | |
| if (!is.null(zz)) { | |
| dx <- (xmax - xmin) | |
| dy <- (ymax - ymin) | |
| if (left) { | |
| Dx <- -dx | |
| pos <- 2 | |
| xpos <- xmin + Dx * 0.5 | |
| } | |
| else { | |
| Dx <- +dx | |
| pos <- 4 | |
| xpos <- xmax + Dx * 0.5 | |
| } | |
| Ypos <- ymin + (zz - zmin)/(zmax - zmin) * dy | |
| segments(xmin, Ypos, xmax, Ypos, col = lab.col) | |
| segments(xpos + Dx * 0.25, Ypos, xmin, Ypos, col = lab.col) | |
| if (is.null(zlabel)) { | |
| text(xpos, Ypos, formatC(zz, digits = digit, format = "f"), pos = pos, col = lab.col, ...) | |
| } else { | |
| text(xpos, Ypos, formatC(zlabel, digits = digit, format = "f"), pos = pos, col = lab.col, ...) | |
| } | |
| } | |
| if (!is.null(main)) { | |
| for (i in length(main):1) text(x = mean(c(xmin, xmax)), | |
| y = ymax + 0.05 * (length(main) - i + 1), labels = main[i], | |
| adj = c(0.5, 0.5), cex = main.cex, col = main.col) | |
| } | |
| par(new = FALSE) | |
| par(mar = omar) | |
| } | |
| ### example usage | |
| # singleMapFun(currResLYR2, studyareaSHP=extSHP, pointsSHP=currPTS, basemapSHP=basemapSHP, revpal=FALSE, digit=2, palname='Greys', letter='a', main="", res="high", colScale='quantile', path=file.path(dir(expDIR,full.names=TRUE)[i], "geoplot_cs_resistance.tiff")) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment