R укрепить, вызывая разрывы полигонов

10

У меня возникли некоторые проблемы при построении моих пространственных данных с использованием ggplot2. Карта выглядит хорошо при построении с использованием spplot, поэтому я предполагаю, что разрыв происходит на этапе укрепления.

Код выглядит следующим образом:

#install the packages
library(rgdal)
library(mapproj)
library(raster)
library(rgeos)
library(ggplot2)
library(plyr)

if (!require(gpclib)) install.packages("gpclib", type="source")
gpclibPermit()

setwd("C:/Users/My Documents")

#read in laa to regional mapping
#must aggregate to higher level regions as data is provided at this higher level
laa_region_mapping <- read.csv("laa_region.csv", header = TRUE)

#read in LAA polygons
laa_polygons <- readOGR("ctyua_ew_generalised_WGS84.json", "OGRGeoJSON")

#merge by laa to add region column to polygon data
laa_polygons_with_region_data <- merge(laa_polygons, laa_region_mapping,
                                by.x = "CTYUA13NM", by.y = "LAA",
                                all.x = TRUE, all.y = TRUE)

# aggregate laa polygons by the 21 regions (aggregate by regoin_code)
region_polygons <- raster::aggregate(laa_polygons_with_region_data, "region_code")

Агрегирование сработало, что видно по spplot (примечание: я нашел способ агрегирования по регионам из этого поста SE: ​​объединение пространственных полигонов по коду в R )

#plot the resulting polygons using spplot
spplot(region_polygons)

введите описание изображения здесь

Но когда я укрепляю пространственные данные так, чтобы я мог использовать ggplot, вокруг рвется разрыв.

#fortify and merge to create the data frame ggplot will show on the map
region_polygons@data$id <- rownames(region_polygons@data)
region_polygons.points <- fortify(region_polygons, region = "id")

# plot the fortified df using ggplot
ggplot(data = region_polygons.points, aes(x= long, y = lat, group = id, fill=id)) + geom_polygon()

введите описание изображения здесь

Как я могу остановить этот разрыв?

Я смотрел на подобные ответы на SE, но ответы предполагают, что разрыв происходит во время слияния ( Что является причиной «разрывания» полигонов (артефактов) с использованием R, ggplot и geom_polygon? ). Я думаю, что мой разрыв происходит на стадии укрепления, так как сплоттер до укрепления выглядит хорошо.

annievic
источник
вам нужно сначала обобщить ваш набор данных, чтобы устранить проблему (ваша программа не может обработать столько вершин)
Mapperz

Ответы:

15

Вы должны использовать group=groupв aesотображении. Вот воспроизводимый пример вашей проблемы:

library("ggplot2")
library("raster")

x <- getData('GADM', country='GBR', level=2)
y <- fortify(x, region="NAME_2")
head(y)
#     long   lat order  hole piece      group       id
# 1 -2.049 57.23     1 FALSE     1 Aberdeen.1 Aberdeen
# 2 -2.049 57.23     2 FALSE     1 Aberdeen.1 Aberdeen
# 3 -2.049 57.23     3 FALSE     1 Aberdeen.1 Aberdeen
# 4 -2.050 57.23     4 FALSE     1 Aberdeen.1 Aberdeen
# 5 -2.050 57.23     5 FALSE     1 Aberdeen.1 Aberdeen
# 6 -2.050 57.23     6 FALSE     1 Aberdeen.1 Aberdeen


# wrong group aesthetic
ggplot(data=y, aes(y=lat, x=long, group=id, fill=id)) +
  geom_polygon() + 
  guides(fill=FALSE)

wronge aes-group

# fixed plot
ggplot(data=y, aes(y=lat, x=long, group=group, fill=id)) +
  geom_polygon() +
  guides(fill=FALSE)

фиксированный сюжет

система охлаждения реактора
источник
1
Спасибо @rcs, это именно проблема. Это исправлено сейчас.
annievic
4
Краткое объяснение: В наборе данных укрепленных пространственных полигонов id- это идентификатор элемента и groupидентификатор отдельных колец (островков, дырок и т. Д.). Поэтому, если вы рисуете idв качестве группы, она рисует все биты вашего объекта как одно кольцо, отсюда и «разрыв», когда он прыгает между островами.
Spacedman
Для потомков я оставлю здесь еще одно предложение, поскольку часто его вижу ... Обычная причина разрыва полигонов - несортированные данные. Если указание правильной groupэстетики не решает ее (что не относится к этому конкретному примеру), попытка, y <- y[order(y$order),]вероятно, сработает. Именно по этой причине orderстолбец создается fortifyфункцией.
DMP