Useful, if you want to show all data points, but in some regions they are too dense to see any density differences.
from scipy.stats import gaussian_kde
import matplotlib as mpl
from matplotlib import cm
def scatter_with_gaussian_kde(ax, x, y, cmap = cm.viridis, **kwargs):
# https://stackoverflow.com/a/20107592/3015186
from scipy.stats import gaussian_kde
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
idx = z.argsort()
x, y, z = x[idx], y[idx], z[idx]
norm = mpl.colors.Normalize(vmin=z.min(), vmax=z.max())
sm = cm.ScalarMappable(cmap=cmap)
ax.scatter(x, y, c=cmap(norm(z)), **kwargs)
return sm