Python / Matplotlib:为不同的标记

时间:2016-04-04 07:44:28

标签: python python-2.7 matplotlib scatter-plot

几乎完全是问题陈述的内容,但有一点背景:

我正在创建一个程序来绘制大量的点(~10,000,但稍后会更多)。这是使用matplotlib的plt.scatter完成的。此命令是保存图形的循环的一部分,因此我稍后可以为其设置动画。

我想要做的是随机选择这些粒子中的一小部分(比方说,可能是100?)并给它们一个与其余粒子不同的标记,即使它们是同一数据集的一部分。这样我就可以使用它们作为占位符来查看单个粒子以及散装材料的运动。

有没有办法为同一数据的一小部分使用不同的标记?

作为参考,粒子只是使用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)

主循环的每次迭代的位置和速度变化(有相当多的代码),但这些是主要的初始化和绘图程序。

我有一个想法,也许我可以从范围(N)中随机选择一堆i值,并使用ax.scatter()命令在同一轴上绘制它们?

2 个答案:

答案 0 :(得分:2)

这是一个可能的解决方案,让您的点的子集用不同的标记识别:

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

答案 1 :(得分:0)

以下代码可以满足您的需求。我在正确的范围(v_sub_indexN_sub)中选择了0 N_sub个索引,并从更大的范围中抽取(particle_position后缀)样本particle_velocityfor。请注意,您无需循环生成随机样本。 Numpy具有很强的功能,无需使用import numpy as np import matplotlib.pyplot as pl N = 100 xmax = 1. v_sigma = 2.5 / 2. # 95% of the samples contained within 0, 5 v_mean = 2.5 # mean at 2.5 N_sub = 10 v_sub_index = np.random.randint(0, N, N_sub) particle_position = np.random.rand (N) * xmax particle_velocity = np.random.randn(N) particle_position_sub = np.array(particle_position[v_sub_index]) particle_velocity_sub = np.array(particle_velocity[v_sub_index]) particle_position_nosub = np.delete(particle_position, v_sub_index) particle_velocity_nosub = np.delete(particle_velocity, v_sub_index) pl.scatter(particle_position_nosub, particle_velocity_nosub, color='b', marker='o') pl.scatter(particle_position_sub , particle_velocity_sub , color='r', marker='^') pl.show() 循环。

<%@ page buffer="none" %> 
相关问题