Plot trajectories with arrow tips

Hi everyone,

can someone please help me how to make a plot like this:
http://tutorial.math.lamar.edu/Classes/DE/PhasePlane_files/image002.gif

The main issue with it is in the (black) trajectories. As far as i know there is no function in matplotlib to plot trajectories with arrows pointing in a direction.

But I think a good workaround is: plotting the trajectories with plot(…) and use quiver(…) at certain points to get an arrows.

A minimal example would be:

import matplotlib.pyplot as plt
import numpy as np
import scipy.integrate as integrate

if name==“main”:
t = np.linspace(0, 20, 1000)
l = 3
# some starting points
X0s = [[-3.0, 0],
[-3.0, -1],
[-3.0, -2],
[-2, -3.0],
[-1, -3.0],
[0, -3.0],
[1, -3.0],
[2, -3.0],
[3.0, -2],
[3.0, -1],
[3.0, 0.0],
[3.0, 1],
[3.0, 2],
[2, 3.0],
[1, 3.0],
[0, 3.0],
[-1, 3.0],
[-2, 3.0],
[-3.0, 2],
[-3.0, 1],
[0, 0.01],
[0, -0.01],
[0.01, 0],
[-0.01, 0]]
sattel = lambda x,t=0: [-x[0], x[1]]
plt.axis([-l,l,-l,l])

for X0 in X0s:
    state = integrate.odeint(sattel, X0, t).T
    plt.plot(*state, color="k", linewidth=1)
    xs = state[:,::10]
    x_ds = np.asarray(sattel(xs))
    M = np.hypot(x_ds[0],x_ds[1])
    plt.quiver(xs[0],xs[1],x_ds[0]/M,x_ds[1]/M, pivot="mid")#,scale=100, scale_units="width",linewidth=5)

plt.axis([-l,l,-l,l])
plt.show()

That is pretty much what I was looking for except the shafts of the arrows that I can’t get rid off.
You can see what I tried to get this done by uncomment the quiver parameter.
Doing this, you can see, the shafts are (nearly) gone, but the arrows look horrible. I wonder if there is anyway to tell quiver(…) to only plot the heads of the arrow, without the shaft.

Can you please give me a hint how to do this?

Thank you,
Andy

Matplotlib version: 1.0.1
Installed as: Ubuntu package
OS: Ubuntu 11.10

You can increase both the “headlength” and “headaxislength” parameters. It’s admittedly pretty hacky, but I think it’ll do what you want.

Also, this is related to a previous discussion on streamlines. A couple of users were kind enough to post code in this thread. (And there was talk of integrating one or both of these into matplotlib.) I’ve actually been using a modified version of Tom Flannaghan’s code. Tom’s code uses a FancyArrowPatch to draw the arrow heads, which may be an alternative approach to using quiver. Note that neither streamline function allows you to specify starting points (you specify the streamline density and the algorithms pick their own starting points).

Best,
-Tony

···

On Sun, Nov 13, 2011 at 7:52 AM, asd dasdas <a.lwtzky@…878…982…> wrote:

Hi everyone,

can someone please help me how to make a plot like this:
http://tutorial.math.lamar.edu/Classes/DE/PhasePlane_files/image002.gif

The main issue with it is in the (black) trajectories. As far as i know there is no function in matplotlib to plot trajectories with arrows pointing in a direction.

But I think a good workaround is: plotting the trajectories with plot(…) and use quiver(…) at certain points to get an arrows.

A minimal example would be:

import matplotlib.pyplot as plt
import numpy as np
import scipy.integrate as integrate

if name==“main”:
t = np.linspace(0, 20, 1000)
l = 3

# some starting points
X0s = [[-3.0, 0],
        [-3.0, -1],
        [-3.0, -2],
        [-2, -3.0],
        [-1, -3.0],
        [0, -3.0],
        [1, -3.0],
        [2, -3.0],


        [3.0, -2],
        [3.0, -1],
        [3.0, 0.0],
        [3.0, 1],
        [3.0, 2],
        [2, 3.0],
        [1, 3.0],
        [0, 3.0],
        [-1, 3.0],


        [-2, 3.0],
        [-3.0, 2],
        [-3.0, 1],
        [0, 0.01],
        [0, -0.01],
        [0.01, 0],
        [-0.01, 0]]
sattel = lambda x,t=0: [-x[0], x[1]]


plt.axis([-l,l,-l,l])

for X0 in X0s:
    state = integrate.odeint(sattel, X0, t).T
    plt.plot(*state, color="k", linewidth=1)
    xs = state[:,::10]
    x_ds = np.asarray(sattel(xs))


    M = np.hypot(x_ds[0],x_ds[1])
    plt.quiver(xs[0],xs[1],x_ds[0]/M,x_ds[1]/M, pivot="mid")#,scale=100, scale_units="width",linewidth=5)

plt.axis([-l,l,-l,l])
plt.show()

That is pretty much what I was looking for except the shafts of the arrows that I can’t get rid off.
You can see what I tried to get this done by uncomment the quiver parameter.
Doing this, you can see, the shafts are (nearly) gone, but the arrows look horrible. I wonder if there is anyway to tell quiver(…) to only plot the heads of the arrow, without the shaft.

Can you please give me a hint how to do this?