One approach is to plot the data as a scatter plot with low alpha , so you can see individual points as well as a rough measure of density. (The disadvantage of this is that the approach has a limited overlap range that it can show, i.e. the maximum density is about 1 / alpha.)
Here is an example:

As you can imagine, due to the limited range of overlap that can be expressed, there is a trade-off between the visibility of individual points and the expression of the number of overlappings (and the size of the marker, graph, etc.).
import numpy as np import matplotlib.pyplot as plt N = 10000 mean = [0, 0] cov = [[2, 2], [0, 2]] x,y = np.random.multivariate_normal(mean, cov, N).T plt.scatter(x, y, s=70, alpha=0.03) plt.ylim((-5, 5)) plt.xlim((-5, 5)) plt.show()
(I assume that you were referring to 30e3 points, not 30e6. For 30e6, I think some type of averaged density plot will be required.)
tom10
source share