[R-sig-Geo] how to overlay maps on lattice panels?

Edzer Pebesma edzer.pebesma at uni-muenster.de
Wed Nov 21 09:09:58 CET 2012


http://r-spatial.sourceforge.net/gallery/

shows a few options how this can be done with sp::spplot

On 11/20/2012 10:46 PM, Tom Roche wrote:
> 
> summary: How to overlay a geographical map on each panel in a lattice?
> (Note I am not seeking to create a choropleth map.)
> 
> details:
> 
> I have atmospheric data specifying gas concentrations over a 3D space
> with dimensions longitude, latitude, and (vertical) level. Since the
> data is numeric, and I need to plot it by level, lattice::levelplot
> seems to be the "tool for the job." However I also need to spatially
> manipulate the data, and therefore to display data before-and-after, and
> the best way to do that seems to be to overlay the data with a map.
> (Am I missing something?)
> 
>>From the excellent open-access book on package=lattice
> 
> ISBN 978-0-387-75968-5
> e-ISBN 978-0-387-75969-2
> http://dx.doi.org/10.1007/978-0-387-75969-2
> 
> I know how to plot a choropleth map with latticeExtra::mapplot, but
> that's not what I want, which is just to overlay a lattice (or Trellis)
> of levelplot's with the lines of a geographical map. How to do that?
> 
> A relatively small, quite self-contained example follows, in which I
> plot toy data in the sort of lattice layout I need. The toy data covers
> a horizontal space over North America; each panel has bounds=
> 
> longitudes: -130° to -59.5°
> latitudes:  23.5° to 58.5°
> 
> corresponding to this geography
> 
> https://github.com/TomRoche/cornbeltN2O/wiki/images/Cmaq_aqmeii_domain.png
> 
> So how to (programmatically) overlay something like that image over each
> panel in the lattice generated below? Your assistance is appreciated!
> 
> # start example
> library(lattice)
> 
> # Not too many points, for this example
> # -130° to -59.5: (130-59.5)/1.5=47
> # 23.5° to 58.5°: 58.5-23.5     =35
> 
> # define longitudes
> west.lon.deg=-130
> #east.lon.deg=-115    # debugging
> east.lon.deg=-59.5
> step.lon.deg=1.5
> lons  <- c(seq(west.lon.deg, east.lon.deg, step.lon.deg))
> n.lon <- length(lons)
> 
> # define latitudes
> south.lat.deg=23.5
> #north.lat.deg=30.5    # debugging
> north.lat.deg=58.5
> step.lat.deg=1.0
> lats  <- c(seq(south.lat.deg, north.lat.deg, step.lat.deg))
> n.lat <- length(lats)
> 
> # define vertical levels
> bot.lev.mb=1000
> top.lev.mb=50
> n.lev=4
> levs <- c(seq(from=bot.lev.mb, to=top.lev.mb, length.out=n.lev))
> 
> # define concentrations
> grid.3d.len <- n.lon * n.lat * n.lev
> concs <- c(1:grid.3d.len)
> 
> # define grid
> grid.3d.df <- expand.grid(longitude=lons, latitude=lats, level=levs)
> # add concentrations as data
> data.3d.df <- cbind(grid.3d.df, concentration=concs)
> # debugging
> head(data.3d.df)
> tail(data.3d.df)
> 
> sigdigs=3 # significant digits
> # plot "appropriately" for atmospheric data: use
> # * lattice::levelplot
> # * one column, since atmospheric levels stack vertically
> levelplot(
>   concentration ~ longitude * latitude | level, 
>   data=data.3d.df, layout=c(1,n.lev),
>   levs=as.character(round(data.3d.df[['level']], 1)),
>   strip=FALSE,
>   strip.left=strip.custom(
>     factor.levels= # thanks, David Winsemius
>       as.character(signif(unique(data.3d.df[['level']]), sigdigs)),
>     strip.levels=TRUE,
>     horizontal=TRUE,
>     strip.names=FALSE,
>     # gotta shrink strip text size to fit strip width:
>     # more on that separately
>     par.strip.text=list(cex=0.5)
>   )
> )
> # end example
> 
> TIA, Tom Roche <Tom_Roche at pobox.com>
> 
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
> 

-- 
Edzer Pebesma
Institute for Geoinformatics (ifgi), University of Münster
Weseler Straße 253, 48151 Münster, Germany. Phone: +49 251
8333081, Fax: +49 251 8339763  http://ifgi.uni-muenster.de
http://www.52north.org/geostatistics      e.pebesma at wwu.de



More information about the R-sig-Geo mailing list