【问题标题】:Drawing phase space trajectories with arrows in matplotlib在 matplotlib 中用箭头绘制相空间轨迹
【发布时间】:2016-08-05 02:24:52
【问题描述】:

我正在尝试为某个动力系统绘制相空间图。实际上,我有一个二维平面,其中有一个起点,然后是下一个点,依此类推。我想用线连接这些点,最重要的是我想画一些箭头,这样我就可以看到方向(起点到下一个点等)。我决定使用线型'->' 来实现这一点,但它并没有给出任何好的结果,而且箭头实际上似乎多次指向错误的方向。它们的间距也很近,因此我看不到单独的线条。

我的代码如下:

import numpy as np
import matplotlib.pylab as plt
from scipy.integrate import odeint

def system(vect, t):
    x, y = vect
    return [x - y - x * (x**2 + 5 * y**2), x + y - y * (x**2 + y**2)]

vect0 = [(-2 + 4*np.random.random(), -2 + 4*np.random.random()) for i in range(5)]
t = np.linspace(0, 100, 1000)

for v in vect0:
    sol = odeint(system, v, t)
    plt.plot(sol[:, 0], sol[:, 1], '->')

plt.show()

结果图如下所示:

可以看出,箭头未正确对齐连接点的线。此外,许多箭头正在“出去”,我希望它们“进来”,因为下一个点总是位于中间的闭环。此外,情节看起来太乱了,我想绘制更少的箭头,这样情节会更好看。有人知道怎么做吗?提前致谢。

【问题讨论】:

  • 您可以使用plot(x,y,marker='o',markevery=5) 来标记每5 个点。让他们指向正确的方向虽然更难......
  • 谢谢。我至少会用这个。然而,方向对我来说同样重要。
  • 也看看这个问题:stackoverflow.com/questions/23345565/…,也许会给你一些启发:)
  • 线条样式'->'不是箭头。它由两部分组成,'-' 表示实线,'>' 表示三角形指向右侧。如果你仔细观察,你所有的“箭头”都只是指向右边的三角形。
  • @wflynny:对!那么我真的需要为这个问题找到一个好的答案。 :)

标签: python matplotlib plot


【解决方案1】:

我认为解决方案应该是这样的:

使用该代码:

import numpy as np
import matplotlib.pylab as plt
from scipy.integrate import odeint
from scipy.misc import derivative
    
def system(vect, t):
    x, y = vect
    return [x - y - x * (x**2 + 5 * y**2), x + y - y * (x**2 + y**2)]
    
vect0 = [(-2 + 4*np.random.random(), -2 + 4*np.random.random()) for i in range(5)]
t = np.linspace(0, 100, 1000)

color=['red','green','blue','yellow', 'magenta']
    
plot = plt.figure()
    
for i, v in enumerate(vect0):
    sol = odeint(system, v, t)
    plt.quiver(sol[:-1, 0], sol[:-1, 1], sol[1:, 0]-sol[:-1, 0], sol[1:, 1]-sol[:-1, 1], scale_units='xy', angles='xy', scale=1, color=color[i])    

plt.show(plot)    

[编辑:对索引的一些解释:

  • 可以在此处找到 quiver 及其参数的定义:https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.quiver
  • 可以在这里找到箭袋的好例子:https://www.getdatajoy.com/examples/python-plots/vector-fields
  • quiver 需要向量作为输入,由起点和终点定义(起点和终点基本上是存储在 sol 中的线坐标的 i 和 i+1 点)
  • 因此,向量数组的长度将比坐标数组的长度短一
  • 为了弥补这一点并为坐标和向量提供相同长度的数组以进行颤动,我们必须按如下方式使用索引:
  • sol[:-1, 0] (:-1 in first index 删除最后一个坐标)
  • sol[1:, 0](1:在第一个索引开始下降第一个坐标)
  • 因此sol[1:, 0] - sol[:-1, 0] 是创建两个长度为 n-1 的向量并以结果为sol[i+1] - sol[i] 的方式相减的便捷方法

【讨论】:

  • 太棒了!为我工作。但是,我希望看到您在 plt.quiver 中使用的 sol 索引的一些解释。
  • 对不起,我已经包含了一些解释,希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
相关资源
最近更新 更多