三维图表

MATLAB和Python都可以绘制三维图表。但相对而言,MATLAB绘制三维图表的能力远远大于Python Matplotlib包的对应能力。MATLAB甚至可以绘制四维标量场和向量场的图形。本节主要介绍用MATLAB和Python Matplotlib包绘制科学计算可视化常用的曲面图、等值线图和向量图。[大谦MATLAB,dqmatlab点com]

曲面图

三维曲面数据最常见的是用曲面图来表现。曲面数据可以是规则网格数据,也可以是不规则散乱数据。规则网格数据可以用MATLAB和Python提供的函数直接绘制。不规则散乱数据可以直接生成Delaunay三角网来表现,或者通过插值转换为规则网格数据以后用相应的函数来绘制。这里主要介绍规则网格数据的绘制。

【MATLAB】

MATLAB中绘制规则网格数据,可以用线框模型、刻面模型和曲面模型来表现。线框模型是线形网格;刻面模型用面来表现,但是网格上的每个小面着同一种颜色;曲面模型在每个小面上采用插值着色,整体颜色呈现渐变的效果。

在MATLAB命令窗口输入:

code.matlab
>> x=linspace(-5,5,40);    %x轴等间隔点
>> y=linspace(-5,5,40);    %y轴等间隔点
>> [X,Y]=meshgrid(x,y);    %用meshgrid生成X矩阵和Y矩阵
>> Z=sin(X).*sin(Y);    %用函数计算Z矩阵
>> surface(X, Y, Z)    #绘三维曲面

生成图19-17。默认时,surface函数生成的是刻面模型。

Document Image Document Image

图19-17 用MATLAB绘曲面图 图19-18 用Python绘曲面图

【Python】

Python中用坐标轴大小的plot_surface方法绘三维曲面图。在Python IDLE Shell窗口输入下面的语句行:

code.python
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> ax=plt.figure().add_subplot(projection='3d')    #注意与二维情况下有所不同
>>> x=np.arange(-5,5,0.25)    #x轴等间隔点
>>> y=np.arange(-5,5,0.25)    #y轴等间隔点
>>> X,Y=np.meshgrid(x,y)    #网格化得到X矩阵和Y矩阵
>>> Z=np.sin(X)*np.sin(Y)    #用函数计算Z矩阵
>>> ax.plot_surface(X, Y, Z)    #绘三维曲面

生成图19-18。

等值线图

给定一个统计量,在它的最小值和最大值之间等间隔取若干值。对于每个值,在曲面图上将值相同的点依次用直线段连接得到一根封闭曲线。所有值对应的曲线投影到x-y二维平面,构成等值线图。所以,等值线图是用二维图形表现三维数据。MATLAB和Python Matplotlib包中都提供了contour函数绘制等值线图。

【MATLAB】

在MATLAB命令窗口输入:

code.matlab
>> x=linspace(-5,5,40);
>> y=linspace(-5,5,40);
>> [X,Y]=meshgrid(x,y);    %计算X矩阵和Y矩阵
>> Z=sin(X).*sin(Y);    %计算Z矩阵
>> contour(X, Y, Z)    %绘等值线图

生成图19-19。

Document Image Document Image

图19-19 用MATLAB绘等值线图 图19-20 用Python绘等值线图

【Python】

在Python IDLE Shell窗口输入下面的语句行:

code.python
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> x=np.arange(-5,5,0.25)
>>> y=np.arange(-5,5,0.25)
>>> X,Y=np.meshgrid(x,y)    #用meshgrid函数获取X矩阵和Y矩阵
>>> Z=np.sin(X)*np.sin(Y)    #计算Z矩阵
>>> plt.contour(X,Y,Z,levels=10)    #绘等值线图
>>> plt.xticks(fontsize=16)
>>> plt.yticks(fontsize=16)

生成图19-20。

向量图

等值线是利用标量场数据绘图,X矩阵和Y矩阵对应的Z矩阵中的每个元素是一个标量,比如高程,温度等,强调的是值的大小。向量场则可以绘制向量场的图形。二维向量场中,X矩阵和Y矩阵定义的每个点上对应有x方向和y方向的向量。向量是有长度、有方向的,所以常用不同长度和方向的箭头来表示各点的向量。

【MATLAB】

下面获取曲面数据的X矩阵、Y矩阵和Z矩阵,利用Z数据计算各点处x方向的梯度U和y方向的梯度V,然后使用quiver函数,用X,Y,U,V数据绘向量图。

在MATLAB命令窗口输入:

code.matlab
>> x=linspace(-5,5,40);
>> y=linspace(-5,5,40);
>> [X,Y]=meshgrid(x,y);    %X矩阵和Y矩阵定义平面上的点
>> Z=sin(X).*sin(Y);    %计算Z矩阵
>> [U,V]=gradient(Z,.2,.2);    %计算各点处x方向的梯度U和y方向的梯度V
>> quiver(X,Y,U,V)    %绘向量图

生成图19-21。

Document Image Document Image

图19-21 用MATLAB绘向量图 图19-22 用Python绘向量图

【Python】

在Python IDLE Shell窗口输入下面的语句行:

code.python
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> x=np.arange(-5,5,0.5)
>>> y=np.arange(-5,5,0.5)
>>> X,Y=np.meshgrid(x,y)    #X矩阵和Y矩阵定义平面上的点
>>> Z=np.sin(X)*np.sin(Y)    #计算Z矩阵
>>> U,V=np.gradient(Z)    #计算各点处x方向的梯度U和y方向的梯度V
>>> plt.quiver(X,Y,U,V)    #绘向量图
>>> plt.xticks(fontsize=16)
>>> plt.yticks(fontsize=16)

生成图19-22。