此问题与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')
计算二维直方图以估计点的密度。 注意:箱数和范围是您必须根据数据调整的内容。
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')
最后,找到计数大于某个预定义值的位置。 注意:您还必须调整此阈值,以便在“占用”和“非占用”区域之间获得所需的区别:
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)
当然,所有的绘图都只是说明性的,对算法来说并不重要。