Tyson
基本上,你需要某种密度估计。有多种方法可以做到这一点:使用某种类型的二维直方图(例如matplotlib.pyplot.hist2d或matplotlib.pyplot.hexbin)(也可以将结果显示为等高线--只需使用numpy.histogram2d,然后对结果数组进行等高线即可。)
进行核密度估计(KDE)并对结果进行轮廓化。KDE本质上是一个平滑的直方图。它不是一个点落入一个特定的垃圾箱,而是给周围的垃圾箱增加了一个权重(通常是高斯“钟形曲线”)。
使用二维直方图简单易懂,但基本上可以得到“块状”的结果。
做第二个“正确的”有一些皱纹(即没有一个正确的方法)。这里我不详细介绍,但是如果你想从统计学上解释结果,你需要阅读它(特别是带宽选择)。
无论如何,这里有一个不同的例子。我将以类似的方式绘制每一个,因此我不使用等高线,但您可以同样轻松地使用等高线图绘制二维直方图或高斯KDE:import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import kde
np.random.seed(1977)
# Generate 200 correlated x,y points
data = np.random.multivariate_normal([0, 0], [[1, 0.5], [0.5, 3]], 200)
x, y = data.T
nbins = 20
fig, axes = plt.subplots(ncols=2, nrows=2, sharex=True, sharey=True)
axes[0, 0].set_title('Scatterplot')
axes[0, 0].plot(x, y, 'ko')
axes[0, 1].set_title('Hexbin plot')
axes[0, 1].hexbin(x, y, gridsize=nbins)
axes[1, 0].set_title('2D Histogram')
axes[1, 0].hist2d(x, y, bins=nbins)
# Evaluate a gaussian kde on a regular grid of nbins x nbins over data extents
k = kde.gaussian_kde(data.T)
xi, yi = np.mgrid[x.min():x.max():nbins*1j, y.min():y.max():nbins*1j]
zi = k(np.vstack([xi.flatten(), yi.flatten()]))
axes[1, 1].set_title('Gaussian KDE')
axes[1, 1].pcolormesh(xi, yi, zi.reshape(xi.shape))
fig.tight_layout()
plt.show()
有一点需要注意:由于点数太多,scipy.stats.gaussian_kde将变得非常慢。通过做一个近似值来加速它是相当容易的——只需取二维直方图,用一个半径和协方差都合适的高斯滤波器来模糊它。如果你愿意,我可以举个例子。
另一个警告:如果在非笛卡尔坐标系中执行此操作,则这些方法都不适用!得到球壳的密度估计要复杂一些。
赞踩评论- 2020年3月31日 00:19