Python - 随机地对一系列要绘制的点进行分类

时间:2015-07-09 12:38:24

标签: python matplotlib scatter-plot

我有两个列表,ONx,我希望在散点图中一起绘制。

列表包含太多数据点。我想要一个点数少得多的图表。我不能裁剪修剪这些列表,我需要从这两个列表中随机分配一定数量的点。什么是最好的方法来解决这个问题?

3 个答案:

答案 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()

enter image description here

答案 1 :(得分:2)

您可以使用随机索引掩码从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绘制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]