how to plot different rows of a SpatialPolygonsDataFrame in trellis panels

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

how to plot different rows of a SpatialPolygonsDataFrame in trellis panels

Waichler, Scott R-2
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

Thank you,
ScottWaichler
Pacific Northwest National Laboratory
scott.waichler _at_ pnnl.gov

_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Reply | Threaded
Open this post in threaded view
|

Re: how to plot different rows of a SpatialPolygonsDataFrame in trellis panels

Roger Bivand
Administrator
Scott,

Without having tried your code, how similar is this to these packages:

https://cran.r-project.org/package=micromap
https://cran.r-project.org/package=micromapST

and their JSS papers:

https://www.jstatsoft.org/index.php/jss/article/view/v063i02
https://www.jstatsoft.org/index.php/jss/article/view/v063i03

Roger

On Wed, 23 May 2018, Waichler, Scott R wrote:

> 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
>
> Thank you,
> ScottWaichler
> Pacific Northwest National Laboratory
> scott.waichler _at_ pnnl.gov
>
> _______________________________________________
> R-sig-Geo mailing list
> [hidden email]
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>

--
Roger Bivand
Department of Economics, Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; e-mail: [hidden email]
http://orcid.org/0000-0003-2392-6140
https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en

_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Roger Bivand
Department of Economics
Norwegian School of Economics
Helleveien 30
N-5045 Bergen, Norway
Reply | Threaded
Open this post in threaded view
|

Re: how to plot different rows of a SpatialPolygonsDataFrame in trellis panels

Waichler, Scott R-2
Roger,

> Without having tried your code, how similar is this to these packages:
>
> https://cran.r-project.org/package=micromap
> https://cran.r-project.org/package=micromapST

Thanks for responding.  I looked at the micromap vignettes but it seems their focus is being able to provide small maps in one column in figures where the main emphasis is on statistics presented in other columns.  In my problem, all I want to show are maps.  I haven't been able to do this with a higher-level function like spplot or stplot.  I can imagine doing it with a custom panel function, where lpolygons() is used with input that depends on the panel.  

In case it helps, I should clarify that the "different polygons" I referred to are polygons with different spatial coordinates; the attribute values are a small number of discrete values.  My polygons are representations of contaminant plumes in groundwater.  For each year, I have read in a shapefile containing polygons of the contaminant concentration at 2 to 4 levels.  I have combined all of these data into a SpatialPolygonsDataFrame, where each row represents a given year and concentration level, and contains one or more polygons.  The coordinates are different in each row, but years and concentration level are common across rows.  This seems to match the nature of a "long table" format in spacetime, but I haven't been able to work it out in that package, hence I'm stepping back and trying to get the basics working with spplot.

Thanks,
Scott

> > 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
> >
> > Thank you,
> > ScottWaichler
> > Pacific Northwest National Laboratory
> > scott.waichler _at_ pnnl.gov
> >
> > _______________________________________________
> > R-sig-Geo mailing list
> > [hidden email]
> > https://stat.ethz.ch/mailman/listinfo/r-sig-geo
> >
>
> --
> Roger Bivand
> Department of Economics, Norwegian School of Economics, Helleveien 30, N-
> 5045 Bergen, Norway.
> voice: +47 55 95 93 55; e-mail: [hidden email]
> http://orcid.org/0000-0003-2392-6140
> https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en

_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Reply | Threaded
Open this post in threaded view
|

Re: how to plot different rows of a SpatialPolygonsDataFrame in trellis panels

Bede-Fazekas Ákos
Dear Scott,

use
spplot(tmp, zcol="z")
instead of
spplot(tmp, zcol=z)
to display the column "z".

Use
spplot(tmp[tmp$id == 1, ], zcol = "z")
to display only those grids that has id 1.

And to display two panels:
tmp$z1 <- tmp$z2 <- tmp$z
tmp$z1[tmp$id == 1] <-  NA
tmp$z2[tmp$id == 2] <-  NA
spplot(tmp, zcol=c("z1", "z2"))

HTH,
Ákos Bede-Fazekas
Hungarian Academy of Sciences


2018.05.23. 21:50 keltezéssel, Waichler, Scott R írta:

> Roger,
>
>> Without having tried your code, how similar is this to these packages:
>>
>> https://cran.r-project.org/package=micromap
>> https://cran.r-project.org/package=micromapST
> Thanks for responding.  I looked at the micromap vignettes but it seems their focus is being able to provide small maps in one column in figures where the main emphasis is on statistics presented in other columns.  In my problem, all I want to show are maps.  I haven't been able to do this with a higher-level function like spplot or stplot.  I can imagine doing it with a custom panel function, where lpolygons() is used with input that depends on the panel.
>
> In case it helps, I should clarify that the "different polygons" I referred to are polygons with different spatial coordinates; the attribute values are a small number of discrete values.  My polygons are representations of contaminant plumes in groundwater.  For each year, I have read in a shapefile containing polygons of the contaminant concentration at 2 to 4 levels.  I have combined all of these data into a SpatialPolygonsDataFrame, where each row represents a given year and concentration level, and contains one or more polygons.  The coordinates are different in each row, but years and concentration level are common across rows.  This seems to match the nature of a "long table" format in spacetime, but I haven't been able to work it out in that package, hence I'm stepping back and trying to get the basics working with spplot.
>
> Thanks,
> Scott
>
>>> 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
>>>
>>> Thank you,
>>> ScottWaichler
>>> Pacific Northwest National Laboratory
>>> scott.waichler _at_ pnnl.gov
>>>
>>> _______________________________________________
>>> R-sig-Geo mailing list
>>> [hidden email]
>>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>>
>> --
>> Roger Bivand
>> Department of Economics, Norwegian School of Economics, Helleveien 30, N-
>> 5045 Bergen, Norway.
>> voice: +47 55 95 93 55; e-mail: [hidden email]
>> http://orcid.org/0000-0003-2392-6140
>> https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en
> _______________________________________________
> R-sig-Geo mailing list
> [hidden email]
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>

_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Reply | Threaded
Open this post in threaded view
|

Re: how to plot different rows of a SpatialPolygonsDataFrame in trellis panels

Kent Johnson
In reply to this post by Waichler, Scott R-2
On Thu, May 24, 2018 at 6:00 AM, <[hidden email]> wrote:

>
> Message: 1
> Date: Wed, 23 May 2018 18:39:07 +0000
> From: "Waichler, Scott R" <[hidden email]>
> To: "[hidden email]" <[hidden email]>
> 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
>

        [[alternative HTML version deleted]]

_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Reply | Threaded
Open this post in threaded view
|

Re: how to plot different rows of a SpatialPolygonsDataFrame in trellis panels

Waichler, Scott R-2
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:[hidden email]]
> Sent: Thursday, May 24, 2018 6:05 AM
> To: [hidden email]; Waichler, Scott R <[hidden email]>
> Subject: Re: how to plot different rows of a SpatialPolygonsDataFrame in
> trellis panels
>
> On Thu, May 24, 2018 at 6:00 AM, <[hidden email]> wrote:
>
> Message: 1
> Date: Wed, 23 May 2018 18:39:07 +0000
> From: "Waichler, Scott R" <[hidden email]>
> To: "[hidden email]" <[hidden email]>
> 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
_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Reply | Threaded
Open this post in threaded view
|

Re: how to plot different rows of a SpatialPolygonsDataFrame in trellis panels

edzer


On 06/01/2018 05:38 AM, Waichler, Scott R wrote:
> 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.

According to https://download.osgeo.org/gdal/old_releases/ the gdal
version you are running is from 2010. You may have followed how gdal has
improved since 2010, and how it has continuously adapted to the dynamics
of the geospatial software ecosystem, as well as to the development of
new geospatial standards.

I made a deliberate choice to let sf users benefit from these
improvements by picking gdal 2.0.1 from 2015 as a minimum requirement,
rather than keep them in the stone ages.

Keeping sf, rgdal and rgeos to work with new releases of gdal, geos and
proj takes a considerable amount of our time not only for Roger and me,
but also for the CRAN maintainers. I hope this takes away some of your
surprise.

>
> Best,
> Scott Waichler
> Pacific Northwest National Laboratory
> Richland, Washington, USA
>
>> -----Original Message-----
>> From: Kent Johnson [mailto:[hidden email]]
>> Sent: Thursday, May 24, 2018 6:05 AM
>> To: [hidden email]; Waichler, Scott R <[hidden email]>
>> Subject: Re: how to plot different rows of a SpatialPolygonsDataFrame in
>> trellis panels
>>
>> On Thu, May 24, 2018 at 6:00 AM, <[hidden email]> wrote:
>>
>> Message: 1
>> Date: Wed, 23 May 2018 18:39:07 +0000
>> From: "Waichler, Scott R" <[hidden email]>
>> To: "[hidden email]" <[hidden email]>
>> 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
> _______________________________________________
> R-sig-Geo mailing list
> [hidden email]
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>

--
Edzer Pebesma
Institute for Geoinformatics
Heisenbergstrasse 2, 48151 Muenster, Germany
Phone: +49 251 8333081

_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Reply | Threaded
Open this post in threaded view
|

Re: how to plot different rows of a SpatialPolygonsDataFrame in trellis panels

Roger Bivand
Administrator
On Fri, 1 Jun 2018, Edzer Pebesma wrote:

>
>
> On 06/01/2018 05:38 AM, Waichler, Scott R wrote:
>> 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.
>
> According to https://download.osgeo.org/gdal/old_releases/ the gdal
> version you are running is from 2010. You may have followed how gdal has
> improved since 2010, and how it has continuously adapted to the dynamics
> of the geospatial software ecosystem, as well as to the development of
> new geospatial standards.
RHEL 6 is EOL in November 2020, so now is the time to move forward. As
Edzer mentions, PROJ, GDAL and GEOS have fixed multiple bugs GDAL has
introduced new drivers over the succession of releases. The GDAL API
changed after 1.11.*, but rgdal does still build with GDAL 1.11.4 and PROJ
4.8.0 (checked recently). From the next (forthcoming) release (1.3.*) of
rgdal, these will be the minimum versions permitted. Even CentOS/RHEL 7
need to install a C++11-capable compiler to build GDAL 2.3.0 - see the
thread at:

https://stat.ethz.ch/pipermail/r-sig-geo/2018-May/026591.html

As Edzer mentions below, users cannot reasonably expect package authors
and maintainers to keep things running in current packages for EOL-near
platforms. If you can provide docker images/containers to emulate near-EOL
platforms (compilers, external dependencies, etc), you can contribute back
to others and protect your workflows by checking systematically that
development versions of sf and rgdal/rgeos can still be installed, pass
R CMD check, and that updates in R packages don't change your results in
other ways than bug-fixes would cause.

We know that institutional users cannot freely upgrade platforms, but RHEL
6 perhaps indicates critical failure to invest by the institution; we know
it happens, but this can't be a priority for package author and maintainer
time.

Roger

>
> I made a deliberate choice to let sf users benefit from these
> improvements by picking gdal 2.0.1 from 2015 as a minimum requirement,
> rather than keep them in the stone ages.
>
> Keeping sf, rgdal and rgeos to work with new releases of gdal, geos and
> proj takes a considerable amount of our time not only for Roger and me,
> but also for the CRAN maintainers. I hope this takes away some of your
> surprise.
>
>>
>> Best,
>> Scott Waichler
>> Pacific Northwest National Laboratory
>> Richland, Washington, USA
>>
>>> -----Original Message-----
>>> From: Kent Johnson [mailto:[hidden email]]
>>> Sent: Thursday, May 24, 2018 6:05 AM
>>> To: [hidden email]; Waichler, Scott R <[hidden email]>
>>> Subject: Re: how to plot different rows of a SpatialPolygonsDataFrame in
>>> trellis panels
>>>
>>> On Thu, May 24, 2018 at 6:00 AM, <[hidden email]> wrote:
>>>
>>> Message: 1
>>> Date: Wed, 23 May 2018 18:39:07 +0000
>>> From: "Waichler, Scott R" <[hidden email]>
>>> To: "[hidden email]" <[hidden email]>
>>> 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
>> _______________________________________________
>> R-sig-Geo mailing list
>> [hidden email]
>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>
>
>
--
Roger Bivand
Department of Economics, Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; e-mail: [hidden email]
http://orcid.org/0000-0003-2392-6140
https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en
_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Roger Bivand
Department of Economics
Norwegian School of Economics
Helleveien 30
N-5045 Bergen, Norway