繁体   English   中英

在R中的2D直方图中找到高密度区域

[英]Finding high density zones in a 2D Histogram in R

我通过以下方式使用MASS的kde2d函数创建了一系列2D直方图:

    # Loading libraries
    library(MASS)
    library(RcolorBrewer)
    # Loading data
    data <- as.matrix(read.table('data.dat'))
    # Create the 2dhist object      
    hist_2d <- kde2d(data[,1],data[,2],n = 60, lims=c(-180,180,-180,180))
    # Define the color palette
    rf <- colorRampPalette(rev(brewer.pal(11,'Spectral')))
    r <- rf(60)
    # Defining the axis
    at_x = seq(-180,180,by=30)
    at_y = seq(-180,180,by=30)
    # Plot the 2DHistogram
    image(hist_2d,col=r,cex.main=3,main='Q68L',axes=F)
    axis(1,lwd.ticks=2,at=at_x,labels=T,cex.axis=2)
    axis(2,lwd.ticks=2,at=at_y,labels=T,cex.axis=2)

直方图产生看起来是这样的。 如何识别所有高密度区域(我在白色正方形内标记了该区域)? 解决此问题的理想方法是针对每个高密度区域抛出一个(x,y)范围的函数,以便可以将其应用于多个数据集中。

预先感谢,如果您需要其他信息,请告诉我

有了正确的数据表示,就可以通过聚类分析来完成。 由于您不提供数据,因此我将用kde2d帮助页面上使用的数据(间歇泉数据)进行说明。 该数据可以很好地分离“高密度”区域(如您的示例图片),因此我将仅使用简单的k均值聚类。

library(MASS)
attach(geyser)
f2 <- kde2d(duration, waiting, n = 50, lims = c(0.5, 6, 40, 100),
            h = c(width.SJ(duration), width.SJ(waiting)) )
image(f2, zlim = c(0, 0.05))

热图

我们需要找到“热点”。 为了了解应该将哪些值视为“高”值,我们可以看一下箱线图。

boxplot(as.vector(f2$z))

箱线图查找异常值

基于此,我将在某种程度上任意使用z值大于0.012的点。 您将需要针对您的特定问题进行调整。

Hot = which(f2$z > 0.012, arr.ind = TRUE)
HotPoints = data.frame(x=f2$x[Hot[,1]], y=f2$y[Hot[,2]])
plot(HotPoints, pch=20, xlim = c(0.5,6), ylim = c(40,100))

热点点

现在我们需要对点进行聚类并找到聚类的x和y范围。 首先,我简单地做一下,证明结果是合理的。

KM3 = kmeans(scale(HotPoints), 3)
plot(HotPoints, pch=20, xlim = c(0.5,6), ylim = c(40,100))
for(i in 1:3) {
    Rx = range(HotPoints[KM3$cluster == i,1])
    Ry = range(HotPoints[KM3$cluster == i,2])
    polygon(c(Rx, rev(Rx)), rep(Ry, each=2))
}

热点地区的边界

我不确定您希望如何将结果呈现给您,但是将它们集中在一处的一种方法是:

XRanges = sapply(unique(KM3$cluster), 
    function(i) range(HotPoints[KM3$cluster == i,1]))
XRanges
         [,1]     [,2]     [,3]
[1,] 3.979592 3.867347 1.734694
[2,] 4.877551 4.316327 2.071429
YRanges = sapply(unique(KM3$cluster), 
    function(i) range(HotPoints[KM3$cluster == i,2]))
YRanges
         [,1]     [,2]     [,3]
[1,] 47.34694 70.61224 73.06122
[2,] 62.04082 87.75510 95.10204

这给出了三个群集中每个群集的x和y的最小值和最大值。

但是,我在这里做了一些选择,我想指出的是,我仍然为您留下了一些工作。 仍然需要做的是:
1.您需要选择一个截止点,以获得群集所需的密度。
2.给定截止点以上的点,您需要说出要生成的簇数。

其余的机器在那里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM