ggplot пропускает полигональные отверстия

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

volcano_in_london

В любом случае, если кто-то знает, как обращаться непосредственно с hole в geom_polygon , это было бы здорово.

Комментарии:

1. Спасибо @timat. Для меня все еще проблема, поскольку мне нужны отверстия, иначе полины перекрываются, а базовая карта затемняется..