Python/Matplotlib : Randomly select "sample" scatter points for different marker

标签 python python-2.7 matplotlib scatter-plot

几乎完全符合问题的内容,但有一点背景:

我正在创建一个程序来绘制大量点(~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 在数据点的子集(样本中未选择的数据点)上调用一次,在采样的子集上调用第二次,并用其绘制每个子集自己的标记。它非常高效并且保持原始数据完整。

enter image description here

关于Python/Matplotlib : Randomly select "sample" scatter points for different marker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36397058/

相关文章:

python - Python 中模拟器/流程图/原理图编辑器的图形前端

python - 如何让 python request.get 等待几秒钟?

python - 有没有办法在 Python 的 Matplotlib 中以点坐标绘制 Line2D?

Python战舰随机数生成器

python - wx.Gauge在Windows中无法更新超过25%,在Linux中有效

python - 使用动态版本的 Python 执行嵌入的 Python 代码时出现致命的 Python 错误

javascript - Odoo 10 添加按钮到 POS

python - 在 matplotlib 中创建一个具有上下边缘的矩形面片

python - Matplotlib:对于浮点来说值太小的对数刻度

python - 将csv数据转换为dict的最佳方法