0

我有一个区域的点云数据(x、y、z 坐标) X 和 Y 的图如下所示: 在此处输入图像描述

我正在尝试在此数据中获取不同集群的多边形。我尝试了以下方法:

points <- df [,1:2] # x and y coordinates 
pts <- st_as_sf(points, coords=c('X','Y'))
conc <- concaveman(pts, concavity = 0.5, length_threshold = 0)

好像我只是得到一个绑定整个数据的多边形。conc$polygons是一个变量的列表。如何定义多个多边形?当我使用 concaveman 时我错过了什么以及它可以提供什么?

4

1 回答 1

1

从您的示例中很难分辨出哪个变量定义了您的集群。下面是一个使用ggplot2data.table(改编自此处)的一些模拟集群的示例。

library(data.table)
library(ggplot2)

# Simulate data:
set.seed(1)
n_cluster = 50
centroids = cbind.data.frame(
  x=rnorm(5, mean = 0, sd=5),
  y=rnorm(5, mean = 0, sd=5)
)
dt = rbindlist(
  lapply(
    1:nrow(centroids),
    function(i) {
      cluster_dt = data.table(
        x = rnorm(n_cluster, mean = centroids$x[i]),
        y = rnorm(n_cluster, mean = centroids$y[i]),
        cluster = i
      )
    }
  )
)
dt[,cluster:=as.factor(cluster)]

# Find convex hull of each point by cluster:
hulls = dt[,.SD[chull(x,y)],by=.(cluster)]

# Plot:
p = ggplot(data = dt, aes(x=x, y=y, colour=cluster)) +
  geom_point() +
  geom_polygon(data = hulls,aes(fill=cluster,alpha = 0.5)) +
  guides(alpha=F)

这会产生以下输出:

带有模拟集群的多边形图。

编辑

如果您没有预定义的集群,则可以使用集群算法。作为一个简单的示例,请参见下面的使用kmeans5 个质心的解决方案。

# Estimate clusters (e.g. kmeans):
dt[,km_cluster := as.factor(kmeans(.SD,5)$cluster),.SDcols=c("x","y")]

# Find convex hull of each point:
hulls = dt[,.SD[chull(x,y)],by=.(km_cluster)]

# Plot:
p = ggplot(data = dt, aes(x=x, y=y, colour=km_cluster)) +
  geom_point() +
  geom_polygon(data = hulls,aes(fill=km_cluster,alpha = 0.5)) +
  guides(alpha=F)

在这种情况下,估计集群的输出几乎等同于构建的集群。

从 k-means 聚类估计的多边形图。

于 2020-06-15T07:41:03.520 回答