我有两个列表,ON
和x
,我希望在散点图中一起绘制。
列表包含太多数据点。我想要一个点数少得多的图表。我不能裁剪或修剪这些列表,我需要从这两个列表中随机分配一定数量的点。什么是最好的方法来解决这个问题?
答案 0 :(得分:4)
您可以使用
对列表进行二次采样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()
答案 1 :(得分:2)
您可以使用随机索引掩码从x
和y
随机选择
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
绘制2D直方图,该直方图使用密度而不是数据点
plt.hist2d(x, y) # No need to subsample
答案 2 :(得分:0)
您可以使用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]