几乎完全符合问题的内容,但有一点背景:
我正在创建一个程序来绘制大量点(~10,000,但稍后会更多)。这是使用 matplotlib 的 plt.scatter 完成的。该命令是保存图形的循环的一部分,因此我可以稍后将其设置动画。
我想要做的是随机选择这些粒子的一小部分(例如,也许 100 个?),并为它们提供与其余粒子不同的标记,即使它们属于同一数据集的一部分。这样我就可以将它们用作占位符来查看单个粒子以及散装 Material 的运动。
有没有办法对相同数据的一小部分使用不同的标记?
作为引用,粒子仅使用 numpy 随机采样器均匀分布,但我的代码是:
for i in range(N): # N number of particles
particle_position[i] = np.random.uniform(0, xmax) # Initialize in spatial domain
particle_velocity[i] = np.random.normal(0, 5) # Initialize in velocity space
for i in range(maxtime):
plt.scatter(particle_position, particle_velocity, s=1, c=norm_xvel, cmap=br_disc, lw=0)
主循环每次迭代的位置和速度都会发生变化(有相当多的代码),但这些是主要的初始化和绘图例程。
我有一个想法,也许我可以从 range(N) 中随机选择一堆 i 值,并使用 ax.scatter() 命令将它们绘制在同一轴上?
最佳答案
以下是一个可能的解决方案,可以使用不同的标记来标识点的子集:
import matplotlib.pyplot as plt
import numpy as np
SIZE = 100
SAMPLE_SIZE = 10
def select_subset(seq, size):
"""selects a subset of the data using ...
"""
return seq[:size]
points_x = np.random.uniform(-1, 1, size=SIZE)
points_y = np.random.uniform(-1, 1, size=SIZE)
plt.scatter(points_x, points_y, marker=".", color="blue")
plt.scatter(select_subset(points_x, SAMPLE_SIZE),
select_subset(points_y, SAMPLE_SIZE),
marker="o", color="red")
plt.show()
它使用了plt.scatter
两次;一次在完整数据集上,另一次在样本点上。
您必须决定如何选择点样本 - 它在 select_subset
函数中被隔离。
您还可以从数据集中提取样本点,以防止将它们标记两次,但 numpy 在删除或调整大小方面效率相当低。
也许更好的方法是使用面膜?掩码的优点是可以保持原始数据完整且有序。
以下是使用蒙版的方法:
import matplotlib.pyplot as plt
import numpy as np
import random
SIZE = 100
SAMPLE_SIZE = 10
def make_mask(data_size, sample_size):
mask = np.array([True] * sample_size + [False ] * (data_size - sample_size))
np.random.shuffle(mask)
return mask
points_x = np.random.uniform(-1, 1, size=SIZE)
points_y = np.random.uniform(-1, 1, size=SIZE)
mask = make_mask(SIZE, SAMPLE_SIZE)
not_mask = np.invert(mask)
plt.scatter(points_x[not_mask], points_y[not_mask], marker=".", color="blue")
plt.scatter(points_x[mask], points_y[mask], marker="o", color="red")
plt.show()
如您所见,scatter
在数据点的子集(样本中未选择的数据点)上调用一次,在采样的子集上调用第二次,并用其绘制每个子集自己的标记。它非常高效并且保持原始数据完整。
关于Python/Matplotlib : Randomly select "sample" scatter points for different marker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36397058/