异步社区

异步社区是国内领先的IT专业图书社区,由人民邮电出版社主办,致力于优质学习内容的出版和分享。

34篇博客

使用正确的图表理解数据(四):绘制矢量场流线图

异步社区2018-12-27 11:23
7.5绘制矢量场流线图

流线图可以被用来可视化矢量场的流态。如科学和自然学科中的磁场、万有引力和流体运动等均可以用流线图表示。矢量场通过为每个点指定一个线条和一个或多个箭头的方式进行可视化。强度可以用线条长度表示,方向由指向特定方向的箭头表示。通常,力的强度用特定流线的长度显示,但是有时也可以用流线的密度来表示。


7.5.1 准备工作
我们可以用matplotlib的matplotlib.pyplot.streamplot函数来可视化矢量场。该函数通过在流场中均匀地填充流线来创建图形。最初该函数是用来可视化风模型或者液体流动的,因此不需要严格的矢量线条,而是需要矢量场的统一表现形式。


该函数最重要的参数是(X,Y),它是一维Numpy数组的等距网格。(U,V)参数匹配的是(X,Y)速率的二维Numpy数组。


U和V矩阵在维度上的行数必须等于Y的长度,列的数量必须匹配X的长度。流线图的线条宽度可以单独控制,如果linewidth参数是一个二维数组,将匹配u和v速率的形状,或者可以是所有线条都可以接受的一个简单的整数。对于所有流线,颜色不仅是一个值,而且可以是如linewidth参数一样的矩阵。箭头(FancyArrowPatch类)用来表示矢量方向,可以通过两个参数控制它们。arrowsize改变箭头的大小,arrowstyle改变箭头的格式(例如“simple”“->”)。


7.5.2 操作步骤
我们通过一个简单的例子来了解一下流线图。执行下面的步骤。
(1)创建矢量数据。
(2)打印中间值。
(3)绘制流线图。
(4)显示用来可视化矢量的流线的图形。


示例代码如下。
import matplotlib.pyplot as plt
import numpy as np
Y, X = np.mgrid[0:5:100j, 0:5:100j]
U = X
V = Y
from pprint import pprint
print "X"
pprint(X)
print "Y"
pprint(Y)
plt.streamplot(X, Y, U, V)
plt.show()


上述代码会输出以下文本信息。
X
array([[ 0. , 0.05050505, 0.1010101 , ..., 4.8989899 ,
4.94949495, 5. ],
[ 0. , 0.05050505, 0.1010101 , ..., 4.8989899 ,
4.94949495, 5. ],
[ 0. , 0.05050505, 0.1010101 , ..., 4.8989899 ,
4.94949495, 5. ],
...,
[ 0. , 0.05050505, 0.1010101 , ..., 4.8989899 ,
4.94949495, 5. ],
[ 0. , 0.05050505, 0.1010101 , ..., 4.8989899 ,
4.94949495, 5. ],
[ 0. , 0.05050505, 0.1010101 , ..., 4.8989899 ,
4.94949495, 5. ]])
Y
array([[ 0. , 0. , 0. , ..., 0. ,
0. , 0. ],
[ 0.05050505, 0.05050505, 0.05050505, ..., 0.05050505,
0.05050505, 0.05050505],
[ 0.1010101 , 0.1010101 , 0.1010101 , ..., 0.1010101 ,
0.1010101 , 0.1010101 ],
...,
[ 4.8989899 , 4.8989899 , 4.8989899 , ..., 4.8989899 ,
4.8989899 , 4.8989899 ],
[ 4.94949495, 4.94949495, 4.94949495, ..., 4.94949495,
4.94949495, 4.94949495],
[ 5. , 5. , 5. , ..., 5. ,
5. , 5. ]])


上面代码生成的流线图图表如图7-6所示。


7.5.3 工作原理
使用Numpy的mgrid实例,通过检索二维的网状栅格,我们创建了X和Y的矢量场。


指定网格的范围作为起点和终点(相应的为-2和2)。第三个索引表示步长。步长表示的是起点和终点之间包含的点的数量。如果想要包含终点值,可以使用一个复数作为步长,其中幅值表示起点和终点之间需要的点数量,包含终点。


然后,填充的网状栅格被用于计算矢量的速率。这里,为了演示,我们就简单地使用相同的meshgrid属性作为矢量速率。这将生成一个图形,该图形清晰地显示了矢量场的线性依赖和流。改变一下U和V的值,体会一下U和V是如何影响流线图的。例如,让U = np.sin(X)或者V = sin(Y)。然后,尝试改变起点和终点的值。图7-7是U = np.sin(X)的图形。 


要清楚该图表是生成的线条和箭头补片的集合,因此没有办法(至少现在)更新现有的图形,因为线条和箭头对于矢量和场一无所知。将来的版本可能会实现它,但是目前它是matplotlib的一个公认的局限。


7.5.4 补充说明
当然,这个例子只是让我们初步了解一下matplotlib流线图的特性和能力。当你有真正的数据要可视化时,流线图就会体现出其真正的威力。理解了本节内容后,你就能知道流线图能应用在什么场合。这样当你拿到数据并知道其所属的领域后,你就能够选用最适合的工具来完成工作。



原文网址:       https://www.epubit.com/book/detail/21642
内容来源:异步社区;版权属【人民邮电出版社 异步社区】所有,转载已获得授权;未经授权,不得以任何方式复制和传播本书内容,如需转载请联系异步社区。