Взгляните на функцию Тома Фланнагана streamplot
. соответствующая нить в списке пользователей находится здесь , а также есть еще один подобный фрагмент кода от Ray Speth , который делает вещи немного по-другому.
Если у вас проблемы со скоростью, может быть более эффективно использовать некоторые интеграционные функции scipy вместо чисто интегральных функций numpy
, используемых в обоих этих примерах.Я не пробовал, однако, и они намеренно избегают зависимости от scipy
.(scipy
является довольно сильной зависимостью по сравнению с numpy
)
Из ее примера графика:
import matplotlib.pyplot as plt
import numpy as np
from streamplot import streamplot
x = np.linspace(-3,3,100)
y = np.linspace(-3,3,100)
u = -1-x**2+y[:,np.newaxis]
v = 1+x-y[:,np.newaxis]**2
speed = np.sqrt(u*u + v*v)
plt.figure()
plt.subplot(121)
streamplot(x, y, u, v, density=1, INTEGRATOR='RK4', color='b')
plt.subplot(122)
streamplot(x, y, u, v, density=(1,1), INTEGRATOR='RK4', color=u,
linewidth=5*speed/speed.max())
plt.show()
Другой вариант - использовать VTK
.Это ускоренное 3D-построение, поэтому для создания 2D-графика потребуется правильно настроить камеру (что не так уж сложно), и вы не сможете получить векторный вывод.
Mayavi, tvtk и mlab предоставляют питонные оболочки для VTK.У этого есть много функциональности по этим направлениям.
Самый простой способ использовать VTK для построения потоковых линий из массивов numpy - это использовать mayavi.mlab.flow
.Я пока пропущу пример, но если вы хотите изучить использование VTK, я могу добавить один.