matplotlib能方便制作各种复杂的三维图,而且调用相关函数制图时也非常简单,只需几个程序语句即可完成一个复杂图形的制作。
1.三维制图步骤
制作三维图形时,请遵循如下的步骤:
①引用matplotlib,import matplotlib.pyplot as plt
②引用mpl_toolkits.mplot3d库中的Axes3D类,from mpl_toolkits.mplot3d import Axes3D
③通过Axes3D类将图转换为3D模式。用以下两个语句完成:
fig=plt.figure( )
ax=Axes3D(fig)
④用plot_trisurf(以小三角形构成曲面单元)或plot_surface(以菱形构成曲面单元)制图。
其中plot_trisurf使用的数据是三个一维数组,三个数组对应元素组成三维空间的一个点,plot_surface使用的数据格式比较复杂,x、y方向上被称为网格矩阵,而z方向则是每个网格交叉点上的函数值,所以三个矩阵都是二维矩阵。
下面代码制作了一个四面体,定义三个列表X、Y、Z,其对应的元素形成三维空间中的一个点,共生成四个点,作为四面体4个顶点。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D #引入三维工具
fig=plt.figure( ) #获得figure对象
ax=Axes3D(fig) #设置三维显示模式
X=[0,1,2,2]
Y=[0,4,7,1]
Z=[0,2,1,0] #X、Y、Z对应元素,组成三维空间的一个点
ax.plot_trisurf(X,Y,Z)
plt.show( )
程序运行结果如图8.2.15所示。
上述代码中,按照三维图的制作步骤,采用plot_trisurf函数制图,数据为三个列表,制图结果是一个四面体。
图8.2.15 plot_trisutf制作的四面体
2.plot_trisurf三维曲面图
用plot_trisurf函数制图,首先必须生成制图的三个向量。设一信号在x、y方向分别按sin和cos变化,z方向则是x和y取值乘积的负值再转化为sin信号,令x、y的取值范围都为[-2π,2π],则制图程序可以设计为如下代码:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
s=np.arange(-2*np.pi,2*np.pi,0.1)
x=np.sin(s)
y=np.cos(s)
z=np.sin(-x*y)
fig=plt.figure( )
ax=Axes3D(fig)
ax.plot_trisurf(x,y,z,cmap=cm.jet,linewidth=0.1)
plt.show( )
制图结果如图8.2.16。
3.plot_surface三维曲面图
采用plot_surface函数制作三维曲面图,数据必须采用三个二维矩阵表达。通常采用的方案是,在确定x、y轴的采样点后,通过np.meshgrid函数形成纵、横网格点,然后计算网点上z函数的值,以此完成制图。请看下面程序段制作的三维曲面图。
图8.2.16 plot_trisurf三维曲面图
图8.2.17 plot_surface函数制作的曲面
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
parts=100
angles=np.linspace(0.125,2*np.pi,300)
angles=np.linspace(0.125,2*np.pi,300)
x= np.sin(angles) #x方向采样
y= np.cos(angles) #y方向采样
X,Y=np.meshgrid(x,y) #形成网格点
Z=np.cos(X*Y) #函数值
fig=plt.figure( )(www.daowen.com)
ax=Axes3D(fig)
ax.plot_surface(X,Y,Z,cmap=cm.jet)
plt.show( )#画3d曲面
程序:3维曲面制图
程序运行的结果如图8.2.17所示。
4.等高线图
等高线图是三维图形沿水平方向切割所得到的剖面边沿线图,用于确定山峰(最优点)所在的位置。等高线无需三维包Axes3D的支持,但可以借助plot_surface制图中生成网格点的方案,在确定了x、y轴的网格矩阵X、Y,z轴的函数值Z矩阵后,采用如下方案完成等高线制图:
CS=plt.contour(X,Y,Z,k)
plt.clabel(CS,inline=1,fontsize=10)
其中参数k指水平方向上等距离切k刀,inline参数确定等高线文字标识与等高线的重叠关系,数值1表示文字覆盖其下方部分的线段。
下面的例子先通过高斯分布产生两个山包,然后将两者相减作为Z轴的值,得到一峰一谷(图8.2.18),然后制作其等高线图。
程序:等高线图
import matplotlib.pyplot as plt
import numpy as np
n=200
x=np.linspace(-10.0,10.0,n)
y=np.linspace(-10.0,10.0,n)
s1=2*np.exp(-((x+1)/(3))**2) #生成一条高斯曲线,高斯峰公式 s=A*exp(-((xw)/sigma)**2)
s2=2*np.exp(-((y+2)/(3))**2)
Z1=np.outer(s1,s2) #生成第一个高斯山包
w1=2*np.exp(-((x-2)/4)**2)
w2=2*np.exp(-((y-1)/4)**2)
Z2=np.outer(w1,w2) #生成第二个高斯山包
X,Y=np.meshgrid(x,y)
Z=100*(Z2-Z1)
plt.figure( )
CS=plt.contour(X,Y,Z,10) #制作等高线,横砍10刀
plt.clabel(CS,inline=1,fontsize=10) #inline控制画标签,移除标签下的线
plt.show( )
程序中先用高斯函数产生两条曲线,然后利用两者的外积形成一个山峰Z 1,用同样的方案形成另一个山峰Z 2,令Z是两者之差的100倍,其三维曲面如图8.2.18所示。图中有一个高于水平面的峰,一个低于水平面的低谷,制作等高线图时,应该看到一个正值的峰和一个负值的洼地。
图8.2.18 两个双正态分布产生的峰和谷
图8.2.19 图8.2.18的等高线图
运行该段代码,制作的等高线图如图8.2.19所示。
阅读代码,可以发现制作等高线图的关键语句为:
CS=plt.contour(X,Y,Z,10)
plt.clabel(CS,inline=1,fontsize=10)
第一个语句负责获得横切面,共做10次横切,结果得到水平面以上5个切面,水平线下5个切面。而第二个语句负责标记得到的切割线。
将上述代码的画图部分替换成下面语句,可将水平面以下的等高线(负值)用虚线显示。
plt.figure( )
CS=plt.contour(X,Y,Z,6,colors=ˈkˈ) #设置单色后,负值将用虚线显示,颜色可自定
plt.clabel(CS,fontsize=9,inline=1)
plt.show( )
程序运行的结果如图8.2.20所示:
图8.2.20 黑白虚实线方式制作等高线图
而使用下面的代码,用户可以自己定制每条等高线的颜色、线宽,结果见图8.2.21。
图8.2.21 指定等高线的颜色、宽度
plt.figure( )
CS=plt.contour(X,Y,Z,6,linewidths=np.arange(.5,4,.5),colors=(ˈrˈ,ˈgreenˈ,ˈblueˈ,(1,1,0),ˈ#afeeeeˈ,ˈ0.5ˈ))#用户自定义6种颜色
plt.clabel(CS,fontsize=9,inline=1)
plt.title(ˈCrazy linesˈ)
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。