使用ggplot2绘制带孔的土地

时间:2012-08-21 03:02:01

标签: r ggplot2 polygon

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

我有一个数据框,我将其导出到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"]))

PART1脚本给了我这个输出:

enter image description here

PART2脚本给出了这个输出:

enter image description here

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

PART1输出中我需要解决的一些问题:

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

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

更新01

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

map.shp.raw <- readShapeSpatial("shp_files/map.shp")
map.shp <- fortify(map.shp.raw)

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

1 个答案:

答案 0 :(得分:10)

向@spacedman致意,他说:

  

我多年前提出的用于绘制漏洞的解决方案就是制作   确保在每个洞之后你的x,y坐标返回相同的位置   地点。这会阻止线路四处嗡嗡作响并穿过其他线路   多边形和留下开放区域的绕组数算法   不填充(或不填充)。

(在https://stackoverflow.com/a/12051278/602276

所以,让我们按照他的建议:

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

enter image description here