#r #ggplot2
#r #ggplot2
Вопрос:
У меня возникли трудности с получением ggplot для построения полигонов с отверстиями. Показано следующее. Сначала получите шейп-файл с помощью git clone https://github.com/geotheory/volcano
. Далее:
require(ggplot2); require(ggmap); require(dplyr); require(maptools)
v = readShapePoly('volcano/volcano.shp')
v@proj4string = CRS(' proj=longlat datum=WGS84')
# confirm polygons spatially exclusive (don't overlap)
plot(t(bbox(v)), type='l', lwd=8)
plot(v, col=paste0(colorRampPalette(c('grey','red'))(8),'dd'), add=T)
Выглядит нормально. dd
Альфа должна делать линию невидимой, если она закрыта несколькими полигонами. Теперь давайте попробуем в ggplot.
d = fortify(v) %>% as_data_frame()
bb = bbox(v)
toner = get_stamenmap(c(bb[1,1], bb[2,1], bb[1,2], bb[2,2]), zoom=11, maptype='toner')
ggmap(toner) geom_polygon(data=d, aes(long, lat, group=group, fill=id), alpha=.5)
Центральные полигоны должны перекрываться, поскольку базовая карта полностью скрыта в центре. Давайте проверим наличие отверстий в расширенных данных:
d %>% select(id, hole) %>% table()
hole
id FALSE TRUE
0 278 0
1 715 0
2 392 388
3 388 331
4 390 265
5 265 387
6 328 125
7 125 0
Выглядит нормально, поэтому давайте попробуем визуализировать их по отдельности.
i = 3
plot(v[i,], col='red')
ggplot(filter(d, id == i-1)) geom_polygon(aes(long, lat, group=group, col=hole), fill=NA)
ggplot() geom_polygon(data=filter(d, id==i-1), aes(long,lat, group=group))
Кажется, что-то идет не так. ggplot, похоже, игнорирует отверстия. Если только это не проблема с шейп-файлом. Есть предложения, как это диагностировать / исправить?
Ответ №1:
«hadley / ggplot2: построение полигональных шейп-файлов» говорит «…, состояние отверстия сохраняется, но эта информация не используется ggplot2». К счастью, ggspatial
пакет «Рыба и свисток: отверстия в полигонах ggplot», которому меня научили, похоже, решает некоторые проблемы, такие как проблема перекрытия. (Белая область над надписью «Biggin Hill» не связана с ggspatial
пакетом, потому что она также включена ggplot(d) geom_polygon(aes(long, lat, group = group, fill = id))
в моем env)
devtools::install_github("paleolimbot/ggspatial")
library(ggspatial)
ggmap(toner) geom_spatial(data=v, aes(fill=id), alpha=.8)
Ответ №2:
У меня такая же проблема на карте мира со страной Лесото. Обычно ggplot2 должен обнаруживать отверстие, потому что значение полигона обратное (против часовой стрелки, а не по часовой стрелке, если я помню).
Здесь решение, похоже, удаляет отверстие из выделения.
colorsbrewer_red <- c( "#fff5f0","#fee0d2", "#fcbba1","#fc9272", "#fb6a4a", "#ef3b2c", "#cb181d", "#99000d")
ggmap(toner)
geom_polygon(data=d[!d$hole,], aes(long, lat, group=group, fill=id), alpha=.5)
scale_fill_manual(name = "",
values= colorsbrewer_red,
na.value = "# 808080",
drop=FALSE)
В любом случае, если кто-то знает, как обращаться непосредственно с hole в geom_polygon
, это было бы здорово.
Комментарии:
1. Спасибо @timat. Для меня все еще проблема, поскольку мне нужны отверстия, иначе полины перекрываются, а базовая карта затемняется..