Search code examples
rdictionaryggplot2spatialraster

How to improve a spatial raster map using ggplot when compared to spplot?


How can I improve the legend of spatial raster map plot using ggplot when compared to a spplot() legend?

I would like plot spatial maps using ggplot() instead of ssplot() however there are a few things that I would like to improve when compared to the spplot:

  1. create a ggplot legend that goes from small (bottom) to large values (top)
  2. Have the breaks in the ggplot legend similar to the ssplot() legend so that I know what the boundaries are of each color.

## load packages
require(raster)
require(ggplot2)
require(rgdal)
require(RColorBrewer)
set.seed(1)

r <- raster(xmn=-110, xmx=-90, ymn=40, ymx=60, ncols=40, nrows=40,
          crs="+proj=lcc +lat_1=48 +lat_2=33 +lon_0=-100
+ellps=WGS84")
r <- setValues(r,matrix(rnorm(1600, mean=0.4,sd=0.2))) 

## 1. spatial map with spplot
cuts <-seq(minValue(r),maxValue(r),length.out=8)
cuts = round(cuts,digits=2)
col.regions = brewer.pal(length(cuts)+3-1, "RdYlGn")
print( 
spplot(as(r, 'SpatialGridDataFrame'),at=cuts,
col.regions=col.regions,
colorkey=list(labels=list(at=cuts),at=cuts), pretty=TRUE,
scales=list(draw=T)
) 
)

## 2. spatial map with ggplot
p = rasterToPoints(r); df = data.frame(p)
colnames(df) = c("x", "y", "NDVI")

p  <- ggplot(data=df) + geom_tile(aes(x, y, fill=NDVI)) +
coord_equal() + labs(x=NULL, y=NULL) + 
scale_fill_gradient2(low="red", mid="yellow",high="green",
limits=c(minValue(r),maxValue(r)), midpoint = 0.4) + theme_bw() +
scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0))
print(p)

ssplot() result ssplot

ggplot() result ggplot


Solution

  • thanks @joran for the pointer to that.

    here is an example code and output using the dev version:

    br <- seq(min(df$NDVI), max(df$NDVI), len=8)
    
    ggplot(data=df) + 
      geom_tile(aes(x, y, fill=NDVI)) + 
      scale_fill_gradient(low="red", high="green", 
        breaks=br, labels=sprintf("%.02f", br), 
        guide=guide_colorbar(title=NULL, nbin=100, barheight=unit(0.75, "npc"), label.hjust=1)) + 
      scale_x_continuous(expand=c(0,0)) + 
      scale_y_continuous(expand=c(0,0))
    

    enter image description here

    you can probably try this by:

    # from Hadley's instruction
    install.packages("devtools")
    library(devtools)
    dev_mode() # to avoid interfering with your existing install
    install_github("ggplot2", username="kohske", branch = "feature/new-guides-with-gtable")
    library(ggplot2)
    

    UPDATED:

    here is the instruction for the installation from scratch:

    install.packages(
      c('devtools', 'digest', 'memoise', 'plyr', 'reshape2', 'RColorBrewer', 'stringr', 'dichromat', 'munsell', 'plyr', 'colorspace'), 
      dep=TRUE)
    
    library(devtools)
    dev_mode()
    
    install_github("scales")
    install_github("ggplot2", username="kohske", branch = "feature/new-guides-with-gtable")