【问题标题】:Get multiple polygons for scattered data in R获取R中分散数据的多个多边形
【发布时间】:2020-10-04 11:14:48
【问题描述】:

我有一个区域的点云数据(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 时缺少什么以及它可以提供什么?

【问题讨论】:

    标签: r polygon point-in-polygon concave-hull


    【解决方案1】:

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

    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)
    

    这会产生以下输出:

    编辑

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

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

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

    【讨论】:

    • 实际上,我没有预定义的集群,这就是我想要做的。我想要类似alphashape in python 的东西,它返回多个可以创建为多边形的边界
    • 恐怕我不知道python函数,但听起来它只是在后台计算集群。在 R 中,您可以使用许多可用的聚类算法之一,例如一个简单的kmeans,然后按照上述方法进行操作(或在您的拟合模型上使用cluster::clusplot() 等绘图功能(参见here)。
    • 我要试试,谢谢。我暂时接受这个答案。
    • 谢谢@Mansi,我已经编辑了答案,还用kmeans展示了一个简单的例子。
    猜你喜欢
    • 2014-10-06
    • 1970-01-01
    • 2020-09-10
    • 2017-10-16
    • 2021-10-13
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多