使用matplotlib

时间:2016-04-13 19:23:02

标签: python matplotlib plot

我正在尝试为某个动态系统绘制相空间图。实际上,我有一个2d平面,其中有一个起点,然后是下一个点,依此类推。我想用线连接这些点,并且我想绘制一些箭头,以便我能够看到方向(起点到下一点等)。我决定使用线型'->'来实现这一目标,但它并没有给出任何好的结果,箭头实际上似乎多次指向错误的方向。它们的间距也非常紧密,因此我无法看到各条线。

我的代码如下:

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

结果图如下所示: Phase plot

可以看出,箭头没有与连接点的线正确对齐。此外,许多箭头出现了#34;我希望他们能够进入"因为下一个点始终位于中间的闭环。此外,情节看起来太乱,我想绘制更少的箭头,以便情节看起来更好。有没有人知道如何做到这一点?提前致谢。

1 个答案:

答案 0 :(得分:11)

我认为解决方案看起来像这样:

enter image description here

使用该代码:

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)    

[编辑:关于指数的一些解释:

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