2010-08-04 59 views
4

如何绘制R中地图上一组点的周围区域?例如从地图上的一组点绘制平滑区域R

map('world') 
map.axes() 
p <- matrix(c(50, 50, 80, 100, 70, 40, 25, 60), ncol=2) # make some points 
points(p, pch=19, col="red") 

polygon(p, col="blue") 

......这给了我一个顶点在每个点的多边形,但它看起来相当糟糕。有什么办法可以将多边形“平滑”成某种曲线吗?

回答

3

一个选项是使用Hmisc包中的bezier函数制作一个由贝塞尔曲线界定的多边形。不过,我无法让起点/终点齐整。例如:

## make some points 
p <- matrix(c(50, 50, 80, 100, 70, 40, 25, 60), ncol=2) 
## add the starting point to the end 
p2 <- cbind(1:5,p[c(1:4,1),]) 
## linear interpolation between these points        
t.coarse <- seq(1,5,0.05) 
x.coarse <- approx(p2[,1],p2[,2],xout=t.coarse)$y 
y.coarse <- approx(p2[,1],p2[,3],xout=t.coarse)$y 
## create a Bezier curve           
library(Hmisc) 
bz <- bezier(x.coarse,y.coarse) 
library(maps) 
map('world') 
map.axes() 
polygon(bz$x,bz$y, col=rgb(0,0,1,0.5),border=NA) 
0

以下是一种方法,绘制多边形并使其尽可能美观。这与地图上的区域无关,更多关于如何生成多边形顶点的信息。

library(maps) 
    p <- matrix(c(50, 50, 80, 100, 70, 40, 25, 60), ncol=2)  
    plot(p, pch = 16, col = "red", cex = 3, xlim = range(p[,1]) + c(-10,10), ylim = range(p[,2]) + c(-5, 5)) 
    map(add = TRUE) 
    #click until happy, right-click "stop" to finish 
    p <- locator(type = "l") 
    map() 
    polygon(cbind(p$x, p$y), col = "blue") 

否则,你可以插值顶点中间,不知怎么顺利地把它们,并在LON的上下文/ LAT利用重投影映射可能得到更真实的线段 - 而是取决于你的目的。