使用KDE从点密度获取坐标

时间:2016-10-21 09:17:55

标签: python

我有一组这种形式的点(> 1k):

y,x
173.549,308.176
173.549,313.328
213.26,419.588

使用KDE,我可以使用pcolormeshcontourf绘制点密度。这是一个示例结果,也绘制了点: enter image description here

这是我以前使用的代码:

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
from scipy.stats.kde import gaussian_kde

x, y = np.genfromtxt('terzinoSX.csv', delimiter=',', unpack=True)

y = y[np.logical_not(np.isnan(y))]
x = x[np.logical_not(np.isnan(x))]
k = gaussian_kde(np.vstack([x, y]))
xi, yi = np.mgrid[x.min():x.max():x.size**0.5*1j,y.min():y.max():y.size**0.5*1j]
zi = k(np.vstack([xi.flatten(), yi.flatten()]))

fig = plt.figure(figsize=(7,4))
ax2 = fig.add_subplot(111)

#alpha=0.5 will make the plots semitransparent
#ax1.pcolormesh(yi, xi, zi.reshape(xi.shape), alpha=0.5)
ax2.contourf(yi, xi, zi.reshape(xi.shape), alpha=0.5)

plt.axis('off')
ax2.plot(y,x, "o")
ax2.set_xlim(0, 740)
ax2.set_ylim(515, 0)

#overlay soccer field
im = plt.imread('statszone_football_pitch.png')
ax2.imshow(im, extent=[0, 740, 0, 515], aspect='auto')

fig.savefig('test.png', bbox_inches='tight')

我想有一个点代表人口最多的区域(例如中间点)的坐标,就像“红色”区域上的中点。是否有可能以某种方式?

2 个答案:

答案 0 :(得分:0)

您可以使用np.argmax获取最大坐标。例如:

kde = compute_my_kde()  # Returns a two-dimensional array
y, x = np.argmax(kde)  # x and y are swapped because matplotlib displays images as a matrix (first index is rows, second index is colums)
plt.imshow(kde)  # Show the kde
plt.scatter(x, y)  # Show the maximum point

答案 1 :(得分:0)

我通过添加这些计算人口最多的区域中的点的线来解决这个问题:

xy = np.vstack([x,y])
kde = stats.gaussian_kde(xy)
density = kde(xy)

pts = xy.T[np.argmax(density)]