Dibujando trayectorias espaciales de fase con flechas en matplotlib.

Estoy tratando de dibujar la gráfica de espacio de fase para un determinado sistema dynamic. En efecto, tengo un plano 2d en el que hay un punto de inicio seguido del siguiente punto y así sucesivamente. Quiero conectar estos puntos con líneas y encima de eso, quiero dibujar algunas flechas para poder ver la dirección (punto de inicio al siguiente punto, etc.). Decidí usar el tipo '->' línea '->' para lograr esto, pero no da ningún buen resultado y las flechas parecen apuntar en la dirección equivocada muchas veces. También están muy espaciadas y, por lo tanto, no puedo ver las líneas individuales.

Mi código se da a continuación:

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

La ttwig resultante se muestra a continuación: Gráfico de fase

Como puede verse, las flechas no están alineadas correctamente con las líneas que conectan los puntos. Además, muchas flechas están “saliendo” y quiero que “entren” porque el siguiente punto siempre está hacia el bucle cerrado en el medio. Además, la ttwig parece demasiado desordenada y me gustaría trazar menos flechas para que la ttwig se vea mejor. ¿Alguien tiene alguna idea de cómo hacerlo? Gracias por adelantado.

Creo que una solución se vería así:

introduzca la descripción de la imagen aquí

Usando ese código:

 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) 

[EDIT: Algunas explicaciones sobre los índices:

  • Una definición de carcaj y sus argumentos se pueden encontrar aquí: http://matplotlib.org/api/pyplot_api.html
  • Los buenos ejemplos para el carcaj se pueden encontrar aquí: https://www.getdatajoy.com/examples/python-plots/vector-fields
  • el carcaj requiere vectores como entradas, que están definidos por puntos de inicio y fin (los puntos de inicio y son básicamente los puntos i y i + 1 de las coordenadas de línea almacenadas en sol)
  • Como consecuencia, la longitud de la matriz vectorial será una más corta que la longitud de la matriz de coordenadas
  • Con el fin de compensar por eso y proporcionar arreglos con la misma longitud para que las coordenadas y los vecinos se estremezcan, tenemos que jugar con los índices de la siguiente manera:
  • sol[:-1, 0] (: -1 en el primer índice elimina la última coordenada)
  • sol[1:, 0] (1: en el primer índice comienza a caer la primera coordenada)
  • sol[1:, 0] - sol[:-1, 0] es, por lo tanto, una manera conveniente de crear dos vectores de longitud n-1 y restarlos de manera que el resultado sea sol[i+1] - sol[i]