как обрезать, обрезать или заполнить белым прямоугольник, плотно окружающий внешнюю часть многоугольника, с помощью ggplot2

Я просто пытаюсь заполнить белым цветом область за пределами простого полигона. По какой-то причине он облажался, протянув странный кол через центр, как будто думает, что это истребитель вампиров или что-то в этом роде.

Я пытался следовать этот пост, но что-то пошло не так. Я думал, что это будет проще, но оказалось, что это довольно вспыльчивый маленький демон.

Как заполнить белым цветом область за пределами удобного для проецирования многоугольника, не испортив область внутри многоугольника? спасибо

# reproducible example
library(rgeos)
library(maptools)

shpct.tf <- tempfile() ; td <- tempdir()

download.file( 
    "ftp://ftp2.census.gov/geo/pvs/tiger2010st/09_Connecticut/09/tl_2010_09_state10.zip" ,
    shpct.tf ,
    mode = 'wb'
)

shpct.uz <- unzip( shpct.tf , exdir = td )

# read in connecticut
ct.shp <- readShapePoly( shpct.uz[ grep( 'shp$' , shpct.uz ) ] )

# box outside of connecticut
ct.shp.env <- gEnvelope( ct.shp )

# difference between connecticut and its box
ct.shp.diff <- gDifference( ct.shp.env , ct.shp )

# prepare both shapes for ggplot2
f.ct.shp <- fortify( ct.shp )
outside <- fortify( ct.shp.diff )


library(ggplot2)

# create all layers + projections
plot <- ggplot(data = f.ct.shp, aes(x = long, y = lat))  #start with the base-plot 
layer1 <- geom_polygon(data=f.ct.shp, aes(x=long,y=lat), fill='black')
layer2 <- geom_polygon(data=outside, aes(x=long,y=lat), fill='white')
co <- coord_map( project = "merc" )

# this works
plot + layer1 

# this does not
plot + layer1 + layer2

# this also does not
plot + layer1 + layer2 + co

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


person Anthony Damico    schedule 14.10.2014    source источник
comment
Как насчет plot + layer2 + layer1? Кажется, это работает. Когда вы рисуете многоугольник в многоугольнике, я думаю, вы должны сначала нарисовать внешний многоугольник. Этот пост может оказаться полезным.   -  person jazzurro    schedule 14.10.2014
comment
@jazzurro спасибо за идею, но это не решает того, что я пытаюсь сделать. у меня есть прямоугольник из точек ct.shp.env, которые я хотел бы отобразить, а слой 2 должен скрыть точки за пределами формы Коннектикута. плюс даже с вашим решением слева все еще есть эта странная форма. :( в любом случае, разве layer1 и layer2 не должны идеально дополнять друг друга? Я не понимаю, почему переключение порядка должно иметь значение?   -  person Anthony Damico    schedule 14.10.2014


Ответы (1)


ct.shp.diff состоит из четырех полигонов:

R> length(ct.shp.diff@polygons[[1]]@Polygons)
# 4

or

R> nlevels(outside$group) 
# 4

Поэтому вам нужна групповая эстетика в layer2 (иначе ggplot пытается построить один полигон, что приводит к странным связям между частями):

layer2 <- geom_polygon(data=outside, aes(x=long, y=lat, group=group), fill='white')
plot + layer1 + layer2 + co

сюжет

person rcs    schedule 14.10.2014
comment
благодарю вас!!! это, очевидно, правильно, и мне стыдно за отсутствие этого параметра в другом посте, который я цитировал. приведенный мной пример работает только тогда, когда ограничивающая рамка создается с помощью gEnvelope, поэтому я разместил связанный вопрос (с аналогичной проблемой), где я вручную создаю ограничивающую рамку - stackoverflow.com/questions/26359909/ - person Anthony Damico; 14.10.2014
comment
создание расширенной сетки вручную усложняет задачу, не так ли? :( - person Anthony Damico; 14.10.2014
comment
Пример в вашем новом вопросе создает многоугольник с отверстием. Я не уверен, но, возможно, это проблема в coord_map. Можете ли вы сначала перепроецировать свои данные (spTransform), а затем выполнить операции rgeos? - person rcs; 14.10.2014
comment
я пробовал это .. возможно, я совершал глупую ошибку, как и когда задавал этот вопрос, но я попытался и потерпел неудачу. :( - person Anthony Damico; 14.10.2014