[R-sig-Geo] how to plot different rows of a SpatialPolygonsDataFrame in trellis panels

Waichler, Scott R Scott@W@ichler @ending from pnnl@gov
Fri Jun 1 05:38:33 CEST 2018


Kent,

Thank you for your response to my problem.  Unfortunately, I can't use sf because it has system dependencies I can't meet.  I am using RHEL 6, and am up-to-date with it for gdal, geos, and proj (versions 1.7.3, 3.3.2, 4.7.0 respectively), but the R package sf requires later versions for all of these.   The vignettes for sf make it sound very useful, but alas it seems to be out of reach for me at present.  I am surprised a package that is being positioned for widespread adoption has such stringent requirements.

Best,
Scott Waichler
Pacific Northwest National Laboratory
Richland, Washington, USA

> -----Original Message-----
> From: Kent Johnson [mailto:kent3737 using gmail.com]
> Sent: Thursday, May 24, 2018 6:05 AM
> To: r-sig-geo using r-project.org; Waichler, Scott R <Scott.Waichler using pnnl.gov>
> Subject: Re: how to plot different rows of a SpatialPolygonsDataFrame in
> trellis panels
> 
> On Thu, May 24, 2018 at 6:00 AM, <r-sig-geo-request using r-project.org> wrote:
> 
> Message: 1
> Date: Wed, 23 May 2018 18:39:07 +0000
> From: "Waichler, Scott R" <Scott.Waichler using pnnl.gov>
> To: "r-sig-geo using r-project.org" <r-sig-geo using r-project.org>
> Subject: [R-sig-Geo] how to plot different rows of a
>         SpatialPolygonsDataFrame in trellis panels
> 
> Hello,
> 
> I have a SpatialPolygonsDataFrame.  I would like to do a trellis plot on one of
> the attributes, so that in the panel for a given attribute value, only those
> polygons with that value are plotted.  So, each panel has different polygons
> plotted in it.  I can't figure out how to do this.  In the toy example below, I
> would like to create a trellis plot with one panel showing the polygons with id
> = 1, and another panel showing the polygons with id = 2.
> 
> My goal beyond this toy problem is to do the same thing with stplot, where
> panels correspond to times and each time has a different set of polygons
> plotted.  Will that be possible?  In all the examples I can find of using stplot
> for a space-time grid with the spatial objects being polygons, the polygons
> are the same across time.
> 
> # based on example in help("SpatialPolygonsDataFrame-class")
> Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
> Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
> Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5)))
> Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE)
> Srs1 = Polygons(list(Sr1), "s1")
> Srs2 = Polygons(list(Sr2), "s2")
> Srs3 = Polygons(list(Sr3, Sr4), "s3/4")
> SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3)
> grd <- GridTopology(c(1,1), c(1,1), c(10,10))
> polys <- as(grd, "SpatialPolygons")
> centroids <- coordinates(polys)
> x <- centroids[,1]
> y <- centroids[,2]
> z <- 1.4 + 0.1*x + 0.2*y + 0.002*x*x
> id = factor(sample(c(1,2), size=length(polys), replace=T))
> tmp <- SpatialPolygonsDataFrame(polys,
>       data=data.frame(x=x, y=y, z=z, id=id, row.names=row.names(polys)))
> plot(tmp)  # plots all the square polygons (n = 10*10)
> spplot(tmp)  # plots values of x, y, z, id in separate panels, each with 100
> polys
> spplot(tmp, zcol=z)  # error message about duplication of factor level
> spplot(tmp ~ id, zcol=z, data=tmp)  # won't take formula
> 
> You can do the facetting with ggplot2::geom_sf (in the dev version of
> ggplot2) though I don't think it will use different coordinate ranges for
> different facets:
> 
> devtools::install_github('tidyverse/ggplot2')
> library(sf)
> library(ggplot2)
> tmp2 = st_as_sf(tmp)
> 
> ggplot(tmp2) + geom_sf(aes(fill=z)) + facet_wrap(~id)
> 
> A couple of suggestions here, using tmap or ggspatial, that look promising:
> https://stackoverflow.com/questions/47678480/mapping-different-states-
> with-geom-sf-using-facet-wrap-and-scales-free
> 
> Kent Johnson
> 
> 
> Thank you,
> ScottWaichler
> Pacific Northwest National Laboratory
> scott.waichler _at_ pnnl.gov


More information about the R-sig-Geo mailing list