理论教育 Python三维图制作方法

Python三维图制作方法

时间:2023-11-22 理论教育 版权反馈
【摘要】:图8.2.15plot_trisutf制作的四面体2.plot_trisurf三维曲面图用plot_trisurf函数制图,首先必须生成制图的三个向量。图8.2.16plot_trisurf三维曲面图图8.2.17plot_surface函数制作的曲面from mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cmimport matplotlib.pyplot as pltimport numpy as npparts=100angles=np.linspaceangles=np.linspacex= np.sin #x方向采样y= np.cos #y方向采样X,Y=np.meshgrid(x,y) #形成网格点Z=np.cos(X*Y) #函数值fig=plt.figure( )ax=Axes3Dax.plot_surfaceplt.show( )#画3d曲面程序:3维曲面制图程序运行的结果如图8.2.17所示。下面的例子先通过高斯分布产生两个山包,然后将两者相减作为Z轴的值,得到一峰一谷,然后制作其等高线图。

Python三维图制作方法

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ˈ)

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈