【问题标题】:Plot periodic trajectories绘制周期性轨迹
【发布时间】:2013-01-16 11:16:30
【问题描述】:

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

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

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

【问题讨论】:

  • 不连接数据点有很多话要说。

标签: python numpy matplotlib


【解决方案1】:

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

其次,在情节线中进行中断的一种优雅方法是在每次跳跃时掩盖一个值。然后 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) -- 我在 matplotlib 中学习了一个非常优雅的掩码数组用例
  • 我发现了这个解决方案失败的案例。这是轨迹没有中断的情况。我的解决方法是检查标准是否大于某个最小值(临时选择)。
【解决方案2】:

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

>>> 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) &lt; 0 为负的位置,即粒子向下移动。

【讨论】:

    【解决方案3】:

    为了避免连接线,您必须按段绘制。

    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-')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2020-08-26
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多