如何计算python 2D散点占用面积

Zho*_*gyu 4 python algorithm numpy matplotlib

我用matplotlib绘制了这两个2000点的系列.从图片来看,似乎第一个2000点占用面积小于第二个2000点.但是,如果我想定量计算2000点的第一和第二系列区域占用多少,我该怎么办?

在此输入图像描述 在此输入图像描述

我非常感谢任何帮助,建议或意见.

非常感谢.

fja*_*rri 7

此问题与此无关matplotlib,并且还需要定义"占用区域",这可能会根据您拥有的数据类型而有所不同.如果你想要一种非严格的近似,这是一种方法:

首先,一些测试数据:

import matplotlib
import matplotlib.pyplot as plt

import numpy


x = numpy.random.normal(size=10000)
y = numpy.random.normal(size=10000)

fig = plt.figure()
s = fig.add_subplot(1, 1, 1, aspect=1)
s.set_xlim(-4, 4)
s.set_ylim(-4, 4)
s.scatter(x, y)
fig.savefig('t1.png')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

计算2D直方图以估计点的密度.注意:您需要根据数据调整箱数和范围.

hist, xedges, yedges = numpy.histogram2d(x, y, bins=20, range=[[-4, 4], [-4, 4]])

fig = plt.figure()
s = fig.add_subplot(1, 1, 1)
s.set_xlim(-4, 4)
s.set_ylim(-4, 4)
s.imshow(
    hist, interpolation='nearest',
    extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]],
    cmap=matplotlib.cm.viridis)
fig.savefig('t2.png')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

最后,找到计数数大于某个预定义值的位置.注意:您还必须调整此阈值,以获得"占用"和"非占用"区域之间的所需区别:

over_threshold = hist > 10

fig = plt.figure()
s = fig.add_subplot(1, 1, 1)
s.set_xlim(-4, 4)
s.set_ylim(-4, 4)
s.imshow(
    over_threshold, interpolation='nearest',
    extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]],
    cmap=matplotlib.cm.viridis)
fig.savefig('t3.png')

area = over_threshold.sum() * (xedges[1] - xedges[0]) * (yedges[1] - yedges[0])
print(area)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当然,所有绘图都纯粹是说明性的,并不是算法必不可少的.