在R中绘制多边形

时间:2014-11-05 11:54:08

标签: r polygon

我想从点样本绘制多边形(实际上,多边形是凸包),其坐标为

x <- c(0.66, 0.26, 0.90, 0.06, 0.94, 0.37)
y <- c(0.99, 0.20, 0.38, 0.77, 0.71, 0.17)

当我应用polygon函数时,我得到以下图:

plot(x,y,type="n")
polygon(x,y)
text(x,y,1:length(x))

enter image description here

但这不是我的期望......我想要的是以下情节:

enter image description here

我通过这样做获得了最后一个情节:

good.order <- c(1,5,3,6,2,4)
plot(x,y,type="n")
polygon(x[good.order], y[good.order])
text(x,y,1:length(x))

我的问题

基本上,我的问题是:如何获取索引的向量(在上面的代码中称为good order) 这将允许获得我想要的多边形?

3 个答案:

答案 0 :(得分:8)

假设有凸多边形,只需取一个中心点并计算角度,然后按增加的角度排序。

> pts = cbind(x,y)
> polygon(pts[order(atan2(x-mean(x),y-mean(y))),])

请注意,good.order的任何周期都有效,我的提供:

> order(atan2(x-mean(x),y-mean(y)))
[1] 6 2 4 1 5 3

可能是因为我在x中混合了yatan2,因此它的思维旋转了90度,就像这里一样重要。

答案 1 :(得分:6)

这是一种可能性。我们的想法是使用围绕中心的角度进行排序:

x <- c(0.66, 0.26, 0.90, 0.06, 0.94, 0.37)
y <- c(0.99, 0.20, 0.38, 0.77, 0.71, 0.17)

xnew <- x[order(Arg(scale(x) + scale(y) * 1i))]
ynew <- y[order(Arg(scale(x) + scale(y) * 1i))]

plot(xnew, ynew, type = "n")
polygon(xnew ,ynew)
text(x, y, 1:length(x))

resulting plot

答案 2 :(得分:1)

只需使用功能geometry

convhulln

这里是他们提供的示例(请参阅?convhulln

ps <- matrix(rnorm(3000), ncol=3) # generate points on a sphere
ps <- sqrt(3)*ps/drop(sqrt((ps^2) %*% rep(1, 3)))
ts.surf <- t(convhulln(ps)) # see the qhull documentations for the options
rgl.triangles(ps[ts.surf,1],ps[ts.surf,2],ps[ts.surf,3],col="blue",alpha=.2)

对于绘图,您需要rgl - 包

结果: enter image description here