我正在尝试为某个动态系统绘制相空间图。实际上,我有一个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()
可以看出,箭头没有与连接点的线正确对齐。此外,许多箭头出现了#34;我希望他们能够进入"因为下一个点始终位于中间的闭环。此外,情节看起来太乱,我想绘制更少的箭头,以便情节看起来更好。有没有人知道如何做到这一点?提前致谢。
答案 0 :(得分:11)
我认为解决方案看起来像这样:
使用该代码:
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)
[编辑:关于指数的一些解释:
sol[:-1, 0]
(:第一个索引中的-1将删除最后一个坐标)sol[1:, 0]
(1:在第一个索引中开始丢弃第一个坐标)sol[1:, 0] - sol[:-1, 0]
是一种方便的方法,可以创建两个长度为n-1的向量,并以结果为sol[i+1] - sol[i]