Я хотел бы нарисовать SpatialPolygons
из библиотеки sp
с отверстиями в ggplot2.
Благодаря другим вопросам о stackoverflow, я знаю, что это разрешено при работе с написанными по часовой стрелке полигонами:
qaru.site/info/724353/...
Действительно, при преобразовании SpatialPolygons
с использованием broom::tidy
(заменив ggplot2::fortify
), многоangularьники отверстий сохраняются в направлении по часовой стрелке, чтобы быть нарисованными как отверстия.
В ggplot2 способ рисования полигонов с отверстиями заставляет их рисовать один раз, используя fill
, а другой раз, используя colour
, в противном случае вы можете увидеть линии, пересекающие многоangularьники.
При работе с несколькими подполигонами, некоторые с отверстиями, это более сложно, порядок точек, определенный в broom::tidy
, может не допускать заполнения полигонов (см. изображение ниже).
У кого-нибудь из вас есть решение, чтобы избавиться от этой проблемы с заполнением?
Вот воспроизводимый пример:
library(sp)
library(ggplot2)
# Create two polygons: second would be a hole inside the first
xy = cbind(
x = c(13.4, 13.4, 13.6, 13.6, 13.4),
y = c(48.9, 49, 49, 48.9, 48.9)
)
hole.xy <- cbind(
x = c(13.5, 13.5, 13.45, 13.45, 13.5),
y = c(48.98, 48.92, 48.92, 48.98, 48.98)
)
# Transform as SpatialPolygons with holes
xy.sp <- SpatialPolygons(list(
Polygons(list(Polygon(xy),
Polygon(hole.xy, hole = TRUE)), "1"),
Polygons(list(Polygon(xy + 0.2),
Polygon(xy + 0.35),
Polygon(hole.xy + 0.2, hole = TRUE)), "2")
))
# Transform SpatialObject to be used by ggplot2
xy.sp.l <- broom::tidy(xy.sp)
ggplot(xy.sp.l) +
geom_polygon(aes(x = long, y = lat, group = id, fill = id))
(источник: statnmap.com)