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

时间:2016-03-02 23:27:16

标签: python algorithm numpy matplotlib

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

enter image description here enter image description here

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

非常感谢。

1 个答案:

答案 0 :(得分: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')

enter image description here

计算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')

enter image description here

最后,找到计数数大于某个预定义值的位置。 注意:您也必须调整此阈值,以便在"占用"之间取得理想的区别。和"非占用"方面:

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)

enter image description here

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