xyrange = [[-5, 5], [-5, 5]]
bins = [100, 100]
thresh = 3
N = 100000.0
xdat, ydat = np.random.normal(size=N), np.random.normal(1, 0.6, size=N)
hh, locx, locy = scipy.histogram2d(xdat, ydat, range=xyrange, bins=bins)
posx = np.digitize(xdat, locx)
posy = np.digitize(ydat, locy)
ind = (posx > 0) & (posx <= bins[0]) & (posy > 0) & (posy <= bins[1])
hhsub = hh[posx[ind] - 1, posy[ind] - 1]
xdat1 = xdat[ind][hhsub < thresh]
ydat1 = ydat[ind][hhsub < thresh]
hh[hh < thresh] = np.nan
plt.imshow(np.flipud(hh.T), cmap='jet', extent=np.array(xyrange).flatten(),
    interpolation='none', origin='upper')
plt.colorbar()
plt.plot(xdat1, ydat1, '.', color='darkblue')
plt.show()
Эффективно создавайте график плотности для регионов с высокой плотностью, точки для разреженных регионов