Chciałbym narysować SpatialPolygons
z biblioteki sp
z otworami w ggplot2. Dzięki innym pytania na StackOverflow, wiem, że jest to dozwolone, natomiast do czynienia z ruchem wskazówek zegara napisany wielokątów:
http://stackoverflow.com/questions/12047643/geom-polygon-with-multiple-hole/12051278#12051278
Rzeczywiście, podczas przekształcania SpatialPolygons
użyciu broom::tidy
(zastępując ggplot2::fortify
), otwory wielokąty są zapisywane w kierunku ruchu wskazówek zegara, aby wyciągnąć jak dziury.
W ggplot2 sposób w jaki rysowane są wielokąty z otworami, wymusza ich losowanie jednokrotnie za pomocą fill
, a innym razem za pomocą colour
, w przeciwnym razie mogą pojawić się linie przecinające wielokąty. W przypadku wielu subpolygonów, niektóre z dziurami, jest to trudniejsze, kolejność elementów punktów zdefiniowanych przez broom::tidy
może nie pozwalać na wypełnianie wielokątów (patrz rysunek poniżej).
Czy ktoś z was ma rozwiązanie, aby pozbyć się tego problemu z wypełnianiem?Rysuj przestrzenne poligony z wieloma subpoliami i dziurami za pomocą ggplot2
Oto powtarzalne przykład:
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))
Jedno rozwiązanie pociąga za sobą oddzielenie wielokątów w wywołaniu funkcji SpatialPolygons. na przykład Dwa wielokąty o id = 2 stają się 2a i 2b. Czy jest to możliwe, czy szukasz rozwiązania od xy.sp.l. –