如何在Python中使用绘图程序绘制已知速度u和v分量的流线(numpy二维数组)?
我希望标题已经很清楚了,我正在用分步法和有限差分法解决一个二维的盖子驱动腔体问题(就是一个正方形的区域)。我已经得到了整个区域的速度的u和v分量,而不需要手动计算流线。请问有没有什么命令或者绘图工具可以帮我完成这个工作?
我希望这个问题和编程有关系,因为我需要一个工具来绘制流线,而不需要明确地去计算它们。
我之前用流-涡度的纳维-斯托克斯方程解决过同样的问题,那时候我只需要绘制流函数的等高线图就能得到流线。
我希望这个工具或者绘图工具是一个Python库,而且最好能在Fedora上安装(我也可以妥协用Mint),而且安装过程不要太麻烦!
如果有人能告诉我这个库和相关的命令,我会非常感激,这样可以节省很多时间。
3 个回答
看看 matplotlib
里的 quiver
:
http://matplotlib.sourceforge.net/examples/pylab_examples/quiver_demo.html
在Matplotlib的1.2版本中,现在有了一个叫做streamplot的功能。
你可以看看 Tom Flannaghan的 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提供了Python的封装。它在这方面有很多功能。
使用VTK从numpy数组绘制流线的最简单方法是使用 mayavi.mlab.flow
。我暂时不提供示例,但如果你想探索使用VTK来实现这一点,我可以添加一个示例。