Построение точек и мультиполигональных объектов в R с помощью sf

Я безуспешно пытался построить объекты points и multipolygon sf. Ниже приводится воспроизводимый пример моей проблемы.

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)

multipolygon не появляется, но если я инвертирую порядок:

#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)

В финальном сюжете отсутствуют две точки и ключ.

Как я могу решить эти проблемы? Я думал об изменении bbox объекта multipolygon, чтобы на втором графике появлялись недостающие точки, но я не мог найти для этого способа.

Любая помощь приветствуется.

ИЗМЕНИТЬ.

Изменен epsg файла multipolygon, чтобы он соответствовал points epsg. Однако проблемы остаются.

РЕДАКТИРОВАТЬ2. Это странно, но случайный запуск кода, кажется, дает "правильный график". Я использовал именно этот порядок (скопирован с консоли):

> 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)

и получил это:

Появляется одна из недостающих точек (-85,34), но есть повторяющиеся точки. Также ключ не отображается должным образом. Также кажется, что расположение повторяющихся точек и размер мультиполигона зависят от размера средства просмотра сюжета.


person noriega    schedule 24.05.2018    source источник
comment
sf plotting vignette заставит вас двигаться вправо направление, включает ЧПУ и ключ. Я заржавел на моем sp / sf, но нахожу виньетки Эдзера завершенными.   -  person Chris    schedule 24.05.2018
comment
Возможно, я что-то упустил, но не смог найти в этой виньетке совета по этой проблеме. Спасибо.   -  person noriega    schedule 24.05.2018


Ответы (1)


Я использовал пустой график с экстентом большего сюжета (в данном случае больший экстент принадлежит объекту points) и добавил к нему объекты points и multipolygon:

# 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)

Что дает:

Появляются недостающие точки, но нет ключа. Чтобы добавить ключ, я попытался использовать функцию .image_scale_factor(), но с хороших результатов не получилось..

person noriega    schedule 24.05.2018