Python - 随机对一系列点进行二次采样以绘制

Python - Randomly subsamble a range of points to plot

我有两个列表,xy,我希望将它们一起绘制成散点图。

列表包含太多数据点。我想要一个点数少得多的图表。我不能 croptrim 这些列表,我需要从这两个列表中随机抽取一定数量的点。解决这个问题的最佳方法是什么?

您可以使用 random.sample():

max_points = len(x)

# Assuming you only want 50 points.
random_indexes = random.sample(range(max_points), 50)

new_x = [x[i] for i in random_indexes]
new_y = [y[i] for i in random_indexes]

您可以使用随机索引掩码从 xy 中随机选择

import numpy as np
import matplotlib.pyplot as plt


N = 50
x = np.random.rand(N)
y = np.random.rand(N)

# Pick random 10 samples, 2 means two choices from [0, 1] for the mask
subsample = np.random.choice(2, 10).astype(bool)      
plt.scatter(x[subsample], y[subsample])
plt.show()

或者,您可以使用 hist2d 绘制二维直方图,它使用密度而不是数据点

plt.hist2d(x, y) # No need to subsample

您可以使用

对列表进行二次抽样
idx = np.random.choice(np.arange(len(x)), num_samples)
plt.scatter(x[idx], y[idx])

然而,这让结果有点取决于运气。我们可以做得更好 making a heatmap. plt.hexbin 让这变得特别简单:

plt.hexbin(x, y)

这是一个例子,比较了两种方法:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

np.random.seed(2015)
N = 10**5
val1 = np.random.normal(loc=10, scale=2,size=N)
val2 = np.random.normal(loc=0, scale=1, size=N)

fig, ax = plt.subplots(nrows=2, sharex=True, sharey=True)
cmap = plt.get_cmap('jet')
norm = mcolors.LogNorm()

num_samples = 10**4
idx = np.random.choice(np.arange(len(val1)), num_samples)
ax[0].scatter(val1[idx], val2[idx])
ax[0].set_title('subsample')

im = ax[1].hexbin(val1, val2, gridsize=50, cmap=cmap, norm=norm)
ax[1].set_title('hexbin heatmap')

plt.tight_layout()
fig.colorbar(im, ax=ax.ravel().tolist())

plt.show()