[R-sig-Geo] suggestion for sp.grid()

Dylan Beaudette dylan.beaudette at gmail.com
Wed Dec 15 18:24:41 CET 2010


Thanks Edzer. It seems like there is increasing interest in the use of
ggplot2 functions for plotting spatial data-- possibly due to the
complexity of lattice graphics. However, I think that the latticeExtra
package [1] may have some exciting new functionality that could make
spplot() a much more attractive option for making maps. I spent a
little time last night tinkering with spplot and legend placement [2].
When I have some more time, I'll see about working up some more
examples using latticeExtra functions.

Cheers,
Dylan

1. http://latticeextra.r-forge.r-project.org/
2. http://casoilresource.lawr.ucdavis.edu/drupal/node/962

On Wed, Dec 15, 2010 at 9:13 AM, Edzer Pebesma
<edzer.pebesma at uni-muenster.de> wrote:
> Thanks for the clear example, Dylan. I made this change, and it will be
> in the next version of sp.
>
> On 12/15/2010 05:57 PM, Dylan Beaudette wrote:
>> Shouldn't be posting questions late into the night. I realized that my
>> example was not reproducible.
>>
>> One more time:
>>
>> # setup environment
>> library(gstat)
>> library(latticeExtra)
>> library(grid)
>>
>> # load example data
>> data(meuse.grid)
>>
>> coordinates(meuse.grid) <- ~ x + y
>> gridded(meuse.grid) <- TRUE
>> meuse.grid$soil <- factor(meuse.grid$soil, labels=c('A','B','C'))
>>
>>
>> # hacked version of sp.grid()
>> sp.grid <- function (obj, col = 1, alpha = 1, ...)
>> {
>>     if (is.character(obj))
>>         obj = get(obj)
>>     xy = coordinates(obj)
>>     if (length(col) != 1 && length(col) != nrow(xy)) {
>>     }
>>     gt = as(getGridTopology(obj), "data.frame")
>>     grid.rect(x = xy[, 1], y = xy[, 2], width = gt$cellsize[1],
>>         height = gt$cellsize[2], default.units = "native", gp =
>> gpar(fill = col, col = NA, alpha = alpha))
>> }
>>
>>
>> trellis.par.set(regions=custom.theme()$regions,
>> superpose.polygon=list(col='black', alpha=0.25))
>>
>> # first grid covers entire extent
>> p3 <- spplot(meuse.grid, 'dist', colorkey=list(space='bottom',
>> width=1, height=0.5, tick.number=3))
>>
>> # overlay partially transparent, kind of a hack...
>> p3 <- p3 + layer(sp.grid(meuse.grid[meuse.grid$soil == 'A', ],
>> col='black', alpha=0.25))
>>
>> p3 <- update(p3, key=simpleKey('Shaded Region', points=FALSE,
>> lines=FALSE, rect=TRUE, columns=1, space='top'))
>>
>> p3
>>
>>
>>
>>
>> On Tue, Dec 14, 2010 at 11:32 PM, Dylan Beaudette
>> <dylan.beaudette at gmail.com> wrote:
>>> Hi,
>>>
>>> I was tinkering around with some of the new functions from the
>>> latticeExtra package, and thought of a (messy) hack for plotting
>>> multiple grids. However, due to the way sp.grid() is currently coded,
>>> there is no way to define both grid fill color _and_ outline color:
>>>
>>> gp = gpar(fill = col, col = NULL, alpha = alpha)
>>>
>>> if this line is changed to...
>>>
>>> gp = gpar(fill = col, col = NA, alpha = alpha)
>>>
>>> then outlines will default to no color... It might be nice to add a
>>> new parameter to sp.grid() to allow the user to set the outline color
>>> of the rectangles produced by grid.rect(). If the above line is
>>> changed so that col=NA, then it is possible to overlay two grids (kind
>>> of) like this:
>>>
>>>
>>> library(gstat)
>>> library(latticeExtra)
>>> library(grid)
>>>
>>> # load example data
>>> data(meuse.grid)
>>> coordinates(meuse.grid) <- ~ x + y
>>> gridded(meuse.grid) <- TRUE
>>>
>>> # hacked version of sp.grid()
>>> sp.grid <- function (obj, col = 1, alpha = 1, ...)
>>> {
>>>    if (is.character(obj))
>>>        obj = get(obj)
>>>    xy = coordinates(obj)
>>>    if (length(col) != 1 && length(col) != nrow(xy)) {
>>>    }
>>>    gt = as(getGridTopology(obj), "data.frame")
>>>    grid.rect(x = xy[, 1], y = xy[, 2], width = gt$cellsize[1],
>>>        height = gt$cellsize[2], default.units = "native", gp =
>>> gpar(fill = col, col = NA, alpha = alpha))
>>> }
>>>
>>>
>>> # nice colors
>>> trellis.par.set(regions=custom.theme()$regions,
>>> superpose.polygon=list(col='black', alpha=0.25))
>>>
>>> # first grid covers entire extent
>>> p3 <- spplot(meuse.grid, 'dist', colorkey=list(space='bottom',
>>> width=1, height=0.5, tick.number=3)
>>>
>>> # overlay partially transparent, kind of a hack...
>>> p3 <- p3 + layer(sp.grid(meuse.grid[meuse.grid$soil == 'A', ],
>>> col='black', alpha=0.25))
>>>
>>> # add a new key
>>> p3 <- update(p3, key=simpleKey('Bad Stuff', points=FALSE, lines=FALSE,
>>> rect=TRUE, columns=1, space='top'))
>>>
>>> print(p3)
>>>
>>> Note that I am using an older version of gstat, version 0.9-63. Maybe
>>> this code has been updated since then. If not, what do you think? Are
>>> there any better ways to overlay a couple grids?
>>>
>>> Cheers,
>>> Dylan
>>>
>>
>> _______________________________________________
>> 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
>
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>



More information about the R-sig-Geo mailing list