【问题标题】:how to snip or crop or white-fill a rectangle tightly surrounding the outside of a polygon with ggplot2如何用ggplot2剪断或裁剪或填充紧围绕多边形外部的矩形
【发布时间】:2014-10-14 07:16:13
【问题描述】:

我只是想用白色填充一个简单多边形之外的区域。出于某种原因,它搞砸了,在中心画了一个奇怪的木桩,好像它认为它是吸血鬼杀手什么的。

我尝试关注this post,但有些东西不见了。我本以为这样会更容易,但事实证明它是一个非常暴躁的小恶魔。

如何在不弄乱多边形内部区域的情况下,将适合投影的多边形外部区域填充为白色?谢谢

# 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

【问题讨论】:

  • plot + layer2 + layer1 怎么样?这似乎奏效了。当您在多边形中绘制多边形时,我认为您必须先绘制外部多边形。 This post 可能会有所帮助。
  • @jazzurro 感谢您的想法,但这并不能解决我想要做的事情。我有一个 rectanglect.shp.env 我想要映射,并且 layer2 需要覆盖康涅狄格形状之外的点。加上即使你的解决方案,左边仍然有那个奇怪的形状。 :( 无论如何,layer1layer2 不应该是完全互补的吗?我不明白为什么切换顺序很重要?

标签: r map ggplot2 gis map-projections


【解决方案1】:

ct.shp.diff 由四个多边形组成:

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

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

【讨论】:

  • 谢谢!!!这显然是正确的,我为在我引用的另一篇文章中遗漏了该参数而感到羞耻。我提供的示例仅在使用 gEnvelope 创建边界框时才有效,因此我发布了一个相关问题(有类似问题),我在其中手动创建边界框 - stackoverflow.com/questions/26359909/…
  • 手动创建扩展网格会使这变得更加困难,对吧? :(
  • 新问题中的示例创建了一个带孔的多边形。我不确定,但也许这在coord_map 中存在问题。您可以先重新投影您的数据 (spTransform),然后再执行 rgeos 操作吗?
  • 我试过了.. 我可能一直在犯一个愚蠢的错误,就像我在问这个问题时所犯的那样,但我确实试了一下但失败了。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
相关资源
最近更新 更多