slash89mf
slash89mf

Reputation: 1067

Get coordinates from points density with KDE

I have a set of points (> 1k) in this form:

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

Using KDE, i can plot points density with pcolormesh and contourf. This is an example result, plotting points too: enter image description here

This is the code i used to have the plot:

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

I would like to have one point representing coordinates of most populated zone (middle point for example), like a middle point over the "red" zone. Is it possible in some way?

Upvotes: 0

Views: 1044

Answers (2)

slash89mf
slash89mf

Reputation: 1067

I solved this by adding these lines that calculate the point in the most populated area:

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

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

Upvotes: 1

Till Hoffmann
Till Hoffmann

Reputation: 9877

You can use np.argmax to get the coordinates of the maximum. For example:

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

Upvotes: 0

Related Questions