绘制周期性轨迹

时间:2013-01-16 11:16:30

标签: python numpy matplotlib

我有一些粒子在走廊中移动并且边界条件封闭的数据。 绘制轨迹会产生锯齿形轨迹。 enter image description here

我想知道如何阻止plot()连接点,粒子回到起点。有些东西比如图片的上半部分,但没有"."

我的第一个想法是在numpy数组a[:-1]-a[1:]获得积极时找到索引。然后从0到该索引的绘图。但是如何获得第一次出现a[:-1]-a[1:]的正元素的索引? 也许还有其他一些想法。

3 个答案:

答案 0 :(得分:13)

我会采用不同的方法。首先,我不是通过查看导数的符号来确定跳跃点,因为运动可能会上升或下降,甚至可能会有一些周期性。我会看看那些带有最大衍生物的点。

其次,在绘图线中打破中断的优雅方法是在每次跳转时屏蔽一个值。然后matplotlib会自动制作片段。我的代码是:

import pylab as plt
import numpy as np

xs = np.linspace(0., 100., 1000.)
data = (xs*0.03 + np.sin(xs) * 0.1) % 1

plt.subplot(2,1,1)
plt.plot(xs, data, "r-")

#Make a masked array with jump points masked
abs_d_data = np.abs(np.diff(data))
mask = np.hstack([ abs_d_data > abs_d_data.mean()+3*abs_d_data.std(), [False]])
masked_data = np.ma.MaskedArray(data, mask)
plt.subplot(2,1,2)
plt.plot(xs, masked_data, "b-")

plt.show()

结果给我们: enter image description here

缺点当然是你在每次休息时都会失去一分 - 但是你可以用你的采样率来猜测你可以用更简单的代码交换它。

答案 1 :(得分:3)

要找到粒子越过上边界的位置,您可以执行以下操作:

>>> import numpy as np
>>> a = np.linspace(0, 10, 50) % 5
>>> a = np.linspace(0, 10, 50) % 5 # some sample data
>>> np.nonzero(np.diff(a) < 0)[0] + 1
array([25, 49])
>>> a[24:27]
array([ 4.89795918,  0.10204082,  0.30612245])
>>> a[48:]
array([ 4.79591837,  0.        ])
>>> 

np.diff(a)计算a的离散差异,而np.nonzero找出条件np.diff(a) < 0为负的位置,即粒子向下移动。

答案 2 :(得分:2)

要避开连接线,您必须按段进行绘图。

a的导数改变符号时,可以通过以下快速方式绘制细分:

import numpy as np
a = np.linspace(0, 20, 50) % 5  # similar to Micheal's sample data
x = np.arange(50)  # x scale

indices = np.where(np.diff(a) < 0)[0] + 1  # the same as Micheal's np.nonzero
for n, i in enumerate(indices):
    if n == 0:
        plot(x[:i], a[:i], 'b-')
    else:
        plot(x[indices[n - 1]:i], a[indices[n - 1]:i], 'b-')

enter image description here