为R中的分散数据获取多个多边形
Get multiple polygons for scattered data in R
我有一个区域的点云数据(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
是一个变量列表。
如何定义多个多边形?当我使用凹面人时我错过了什么,它能提供什么?
很难从您的示例中看出什么变量定义了您的集群。下面是一些使用 ggplot2
和 data.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)
这会产生以下输出:
编辑
如果您没有预定义的聚类,您可以使用聚类算法。作为一个简单的示例,请参阅下面的使用 kmeans
和 5 个质心的解决方案。
# 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)
在这种情况下,估计聚类的输出几乎等同于构建的聚类。
我有一个区域的点云数据(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
是一个变量列表。
如何定义多个多边形?当我使用凹面人时我错过了什么,它能提供什么?
很难从您的示例中看出什么变量定义了您的集群。下面是一些使用 ggplot2
和 data.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)
这会产生以下输出:
编辑
如果您没有预定义的聚类,您可以使用聚类算法。作为一个简单的示例,请参阅下面的使用 kmeans
和 5 个质心的解决方案。
# 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)
在这种情况下,估计聚类的输出几乎等同于构建的聚类。