Plotting points and multipolygon objects in R with sf

不问归期 提交于 2019-12-25 03:08:03

问题


I've been trying to plot both points and multipolygon sf objects with no success. Following is a reproducible example of my problem.

library(sf)
library(magrittr)
library(RColorBrewer)

nc <- st_read(system.file("shape/nc.shp", package = "sf")) %>% 
    st_transform(crs = 4326)
points <- data.frame(p = seq(15, 75, 15), 
                     long = c(-85, -80, -78, -75, -82), 
                     lat = c(34, 36, 37, 38, 35)) %>% 
        st_as_sf(coords = c('long', 'lat'), crs = 4326) 
points$p_cut <- cut(points$p, seq(0, 100, 20))

#plot1
plot(points['p_cut'], axes = TRUE, graticule = TRUE, pch = 16, 
     pal = brewer.pal(5, 'Paired'))
plot(st_geometry(nc), axes = TRUE, graticule = TRUE, add = TRUE)

The multipolygon doesn't appear but if I inverse the order:

#plot2
plot(st_geometry(nc), axes = TRUE, graticule = TRUE)
plot(points['p_cut'], axes = TRUE, graticule = TRUE, pch = 16, 
     pal = brewer.pal(5, 'Paired'), add = TRUE)

Two points and the key are missing from the final plot.

How can I overcome these issues? I thought of changing the bbox of the multipolygon object in order to make the missing points appear in the second plot but I couldn't find a way for this.

Any help is appreciated.

EDIT.

Modified the epsg of the multipolygon in order to match the points epsg. The issues remains though.

EDIT2. It's weird but running the code randomly seems to produce the "correct plot". I used this particular order (copied from the console):

> plot(points['p_cut'], axes = TRUE, graticule = TRUE, pch = 16, 
+      pal = brewer.pal(5, 'Paired'))
> plot(points['p_cut'], axes = TRUE, graticule = TRUE, pch = 16, 
+      pal = brewer.pal(5, 'Paired'), add = TRUE)
> plot(st_geometry(nc), axes = TRUE, graticule = TRUE, add = TRUE)
> #plot2
> plot(st_geometry(nc), axes = TRUE, graticule = TRUE)
> plot(points['p_cut'], axes = TRUE, graticule = TRUE, pch = 16, 
+      pal = brewer.pal(5, 'Paired'), add = TRUE)
> # plot1
> plot(points['p_cut'], axes = TRUE, graticule = TRUE, pch = 16, 
+      pal = brewer.pal(5, 'Paired'))
> plot(st_geometry(nc), axes = TRUE, graticule = TRUE, add = TRUE)
> plot(points['p_cut'], axes = TRUE, graticule = TRUE, pch = 16, 
+      pal = brewer.pal(5, 'Paired'), add = TRUE)

and got this:

One of the missing points appears (-85,34) but there are repeated points. Also the key is not shown properly. It seems too that the location of the repeated points and the size of the multipolygon depend on the size of the plot viewer.


回答1:


I used a blank plot with the extent of the bigger plot (in this case the bigger extent belongs to the points object) and added both the points and the multipolygon objects to it:

# sf object with the extent of the points object
bb_sol <- data.frame(long = c(-85, -75, -75, -85),
                     lat = c(34, 34, 38, 38)) %>% 
        st_as_sf(coords = c('long', 'lat'), crs = 4326)
# plot extent
plot(st_geometry(bb_sol), axes = TRUE, graticule = TRUE, pch = '.')
# plot the multipolygon
plot(st_geometry(nc), axes = TRUE, graticule = TRUE, add = TRUE)
# plot the points
plot(points['p_cut'], axes = TRUE, graticule = TRUE, pch = 16, key.pos = NULL, 
pal = brewer.pal(5, 'Paired'), add = TRUE)

Which produces:

The missing points appear but there is no key. In order to add a key I tried to use the .image_scale_factor() function but with no good results.



来源:https://stackoverflow.com/questions/50499991/plotting-points-and-multipolygon-objects-in-r-with-sf

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!