使用ggplot2绘制带孔的土地

lok*_*art 3 r polygon ggplot2

我从这里这里问过同样的问题,但仍然无法解决我的问题.我想我需要提出整个问题并寻求帮助,而不是将其分解成小部分.

我有一个数据框,我将其导出到csv,可以在http://pastebin.com/SNT9Ykt7找到.

chart <- ggplot(data=map.shp,aes(x=long,y=lat))

### PART1 START ###
chart <- chart + geom_polygon(data=map.shp,aes(x=long,y=lat,group=id),colour=rgb(162,159,140,maxColorValue=255),fill=rgb(233,235,232,maxColorValue=255),size=0.1)
### PART1 END ###

### PART2 START ###    
map.group <- unique(map.shp[,"group"])
for (loop in (1:length(map.group))) {
  temp.shp <- map.shp[map.shp[,"group"]==map.group[loop],]
  temp.colour <- "red"
  if (unique(temp.shp[,"hole"])=="TRUE") {
    temp.colour <- "blue"
  }
  chart <- chart + geom_polygon(data=temp.shp,aes(x=long,y=lat,group=id,order=group),colour=rgb(162,159,140,maxColorValue=255),fill=temp.colour,size=0.1)
}
### PART2 END ###

chart <- chart + opts(panel.background=theme_rect(colour=rgb(190,225,247,maxColorValue=255),fill=rgb(190,225,247,maxColorValue=255)),                      
                      panel.grid.major=theme_blank(),
                      panel.grid.minor=theme_blank(),
                      panel.border=theme_blank(),
                      plot.background = theme_blank(),
                      axis.line=theme_blank(),
                      axis.text.x=theme_blank(),
                      axis.title.x=theme_blank(),
                      axis.text.y=theme_blank(),
                      axis.title.y=theme_blank(),
                      axis.ticks=theme_blank())
chart <- chart + coord_cartesian(xlim = range(map.shp[,"long"]), ylim = range(map.shp[,"lat"]))
Run Code Online (Sandbox Code Playgroud)

PART1脚本给我这个输出:

在此输入图像描述

PART2脚本给了我这个输出:

在此输入图像描述

实际上这是一块有一些洞的地方,我将在这一层下面显示其他东西,这样我就必须将这个洞呈现为"洞",因此无法使用PART2脚本进行显示.但PART2脚本正确地绘制地图(红色为陆地,蓝色为洞).

PART1输出中的一些问题我需要修复:

  • 孔的某些部分没有呈现为孔
  • 多边形外部的线被错误地绘制

我不知道我在PART1中做错了什么.有人可以帮忙吗?

更新01

使用以下代码创建txt文件:

map.shp.raw <- readShapeSpatial("shp_files/map.shp")
map.shp <- fortify(map.shp.raw)
Run Code Online (Sandbox Code Playgroud)

附加的txt文件可以保存为txt,并使用read.table命令导入为data.frame.

And*_*rie 10

向@spacedman致敬,他说:

我多年前提出的用于绘制孔的解决方案是确保在每个孔之后你的x,y坐标返回到同一个地方.这会阻止线路四处嗡嗡作响并穿过其他多边形并留下匝数算法未填充的开放区域(或者在不应该填充时填充).

(在/sf/answers/843589491/)

所以,让我们遵循他的建议:

library(plyr2)
map.shp2 <- ddply(map.shp, .(piece), function(x)rbind(x, map.shp[1, ]))
ggplot(data=map.shp2) + geom_polygon(aes(x=long,y=lat))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述