从R中的一组点绘制地图上的平滑区域

时间:2010-08-04 21:37:53

标签: graphics r maps curve

如何在R中的地图上绘制一组点周围的区域? e.g。

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

...它给了我一个在每个点都有顶点的多边形,但看起来很糟糕。有没有办法将多边形“平滑”成某种曲线?

2 个答案:

答案 0 :(得分:3)

一种选择是使用bezier包中的Hmisc函数创建一个由Bézier曲线限定的多边形。但是我不能得到开始/结束点整齐地加入。例如:

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

答案 1 :(得分: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地图的上下文中可以使用重新投影来获得更真实的线段 - 但取决于你的目的。