Python 绘制周期轨迹

Python 绘制周期轨迹,python,numpy,matplotlib,Python,Numpy,Matplotlib,我有一些粒子在封闭边界条件下的走廊中移动的数据。 绘制轨迹将导致锯齿形轨迹。 我想知道如何阻止plot()连接粒子返回起点的点。图片上部有一些类似的东西,但没有“ 我的第一个想法是在numpy数组a[:-1]-a[1:][/code>为正时找到索引。然后从0到该索引进行绘图。但是如何获得a[:-1]-a[1://code>的正元素第一次出现的索引呢? 也许还有其他的想法 要查找粒子穿过上边界的位置,可以执行以下操作: >>> import numpy as np >&g

我有一些粒子在封闭边界条件下的走廊中移动的数据。 绘制轨迹将导致锯齿形轨迹。

我想知道如何阻止
plot()
连接粒子返回起点的点。图片上部有一些类似的东西,但没有

我的第一个想法是在
numpy
数组
a[:-1]-a[1:][/code>为正时找到索引。然后从0到该索引进行绘图。但是如何获得
a[:-1]-a[1://code>的正元素第一次出现的索引呢?

也许还有其他的想法

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

>>> 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.        ])
>>> 
>>将numpy作为np导入
>>>a=np.linspace(0,10,50)%5
>>>a=np.linspace(0,10,50)%5#一些样本数据
>>>np.非零(np.diff(a)<0)[0]+1
数组([25,49])
>>>a[24:27]
阵列([4.89795918,0.10204082,0.30612245])
>>>a[48:]
数组([4.79591837,0.]))
>>> 

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

为了避免连接线,必须分段绘制

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-')
将numpy导入为np
a=np.linspace(0,20,50)%5#类似于Micheal的样本数据
x=np.arange(50)#x标度
指数=np,其中(np.diff(a)<0)[0]+1#与Micheal的np.nonzero相同
对于n,枚举中的i(索引):
如果n==0:
绘图(x[:i]、a[:i]、‘b-’)
其他:
图(x[指数[n-1]:i],a[指数[n-1]:i],'b-')

我会采取另一种方法。首先,我不会通过观察导数的符号来确定跳跃点,因为运动可能会上升或下降,甚至有一些周期性。我会用最大导数来观察这些点

第二,在绘图线中设置断点的一种优雅方法是在每次跳转时屏蔽一个值。然后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()
结果是:


当然,缺点是每次中断都会丢失一个点—但以您似乎拥有的采样率,我想您可以用它来换取更简单的代码。

不连接数据点有很多话要说。+1)--我在matplotlibI中学习了一个非常优雅的掩蔽数组用例,发现了此解决方案失败的案例。在这种情况下,轨迹中没有断点。我的解决方案只是检查std是否大于某个最小值(特别选择)。