Python 第三方模块 绘图 Matplotlib模块 绘制3维图像

    技术2022-07-11  81

    1.mplot3d工具包(mplot3d Toolkit)

    mplot3d Toolkit是Matplotlib中用于绘制3D图像的工具包 绘制3D图像的步骤: 1.创建Axes3D对象 2.调用Axes3D对象的不同方法来绘制的3D图像 创建Axes3D对象: #方法1: 1.导入Axes3D包 2.获取figure对象 3.通过Axes3D(<figure>)来创建Axes3D对象 #实例: >>> from mpl_toolkits.mplot3d import Axes3D >>> fig=plt.figure() >>> ax=Axes3D(fig) ########################################################## #方法2: 1.通过<ax>=add_subplot()/<ax>=fig.subplot()创建子图 2.创建子图时指定projection="3d" 3.返回的ax即为Aexs3D对象 #实例: >>> fig=plt.figure() >>> ax=fig.add_subplot(111,projection="3d") >>> ax=plt.subplot(111,projection="3d") ########################################################## #方法3: 1.获取figure对象 2.通过<ax>=<figure>.gca(projection="3d")获取当前3D绘图区 3.返回的ax即为Axes3D对象 #实例: >>> fig=plt.figure() >>> ax=fig.gca(projection="3d")

    2.绘制3D线性图: 其他参数参见: https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.plot.html

    <ax3d>.plot(<xs>,<ys>[,<zs>,zdir="z",**kwargs]) #参数说明: ax3d:指定3D绘图区对象,将在该绘图区中绘制图像 xs,ys,zs:分别指定数据点的x/y/z坐标;均为1维数组 zs的默认值是所有元素均为0 zdir:指定哪个轴作为z轴;可为"x"/"y"/"z"(默认值):如果为"y",如果不指定zs,数据会被绘制到x-z平面上 #即在不改变手性的情况下对图像进行空间旋转,以从多角度观察 #或变换x/y/z坐标的相对顺序,如zdir="y",将由ys指定z坐标,xs指定x坐标,zs指定y坐标 kwargs:指定其他参数 #实例: >>> import numpy as np >>> import matplotlib.pyplot as plt >>> plt.rcParams['font.sans-serif']=['Microsoft YaHei'] >>> fig=plt.figure() >>> ax=fig.gca(projection='3d') >>> theta=np.linspace(-4*np.pi,4*np.pi,100) >>> z1=np.linspace(-2,2,100) >>> r=z1**2+1 >>> x1=r*np.sin(theta) >>> y1=r*np.cos(theta) >>> z2=np.linspace(-3,3,100) >>> x2=np.sin(z2) >>> y2=np.cos(z2) >>> ax.plot(x1,y1,z1,color='b',label='3D 线性图一') [<mpl_toolkits.mplot3d.art3d.Line3D object at 0x0000020A04C7CDC8>] >>> ax.plot(x2,y2,z2,color='r',label='3D 线性图二') [<mpl_toolkits.mplot3d.art3d.Line3D object at 0x0000020A08386248>] >>> ax.set_title('绘制 3D 线性图示例',pad=15,fontsize='12') Text(0.5, 0.92, '绘制 3D 线性图示例') >>> ax.set_xlabel('x 轴',color='r',fontsize='12') Text(0.5, 0, 'x 轴') >>> ax.set_ylabel('y 轴',color='g',fontsize='12') Text(0.5, 0, 'y 轴') >>> ax.set_zlabel('z 轴',color='b',fontsize='12') Text(0.5, 0, 'z 轴') >>> ax.legend() <matplotlib.legend.Legend object at 0x0000020A0833C948> >>> plt.show()#结果见下图

    >>> import numpy as np >>> import matplotlib.pyplot as plt >>> plt.rcParams['font.sans-serif']=['Microsoft YaHei'] >>> fig=plt.figure() >>> ax=fig.gca(projection='3d') >>> theta=np.linspace(-4*np.pi,4*np.pi,100) >>> z1=np.linspace(-2,2,100) >>> r=z1**2+1 >>> x1=r*np.sin(theta) >>> y1=r*np.cos(theta) >>> z2=np.linspace(-3,3,100) >>> x2=np.sin(z2) >>> y2=np.cos(z2) >>> ax.plot(x1,y1,z1,zdir="y",color='b',label='3D 线性图一') [<mpl_toolkits.mplot3d.art3d.Line3D object at 0x000001E1E52E22C8>] >>> ax.plot(x2,y2,z2,zdir="y",color='r',label='3D 线性图二') [<mpl_toolkits.mplot3d.art3d.Line3D object at 0x000001E1E52E2288>] >>> ax.set_title('绘制 3D 线性图示例',pad=15,fontsize='12') Text(0.5, 0.92, '绘制 3D 线性图示例') >>> ax.set_xlabel('x 轴',color='r',fontsize='12') Text(0.5, 0, 'x 轴') >>> ax.set_ylabel('y 轴',color='g',fontsize='12') Text(0.5, 0, 'y 轴') >>> ax.set_zlabel('z 轴',color='b',fontsize='12') Text(0.5, 0, 'z 轴') >>> ax.legend() <matplotlib.legend.Legend object at 0x000001E1E3F2CAC8> >>> plt.show()#结果见下图

    >>> import numpy as np >>> import matplotlib.pyplot as plt >>> plt.rcParams['font.sans-serif']=['Microsoft YaHei'] >>> fig=plt.figure() >>> ax=fig.gca(projection='3d') >>> theta=np.linspace(-4*np.pi,4*np.pi,100) >>> z1=np.linspace(-2,2,100) >>> r=z1**2+1 >>> x1=r*np.sin(theta) >>> y1=r*np.cos(theta) >>> z2=np.linspace(-3,3,100) >>> x2=np.sin(z2) >>> y2=np.cos(z2) >>> ax.plot(x1,y1,color='b',label='3D 线性图一') [<mpl_toolkits.mplot3d.art3d.Line3D object at 0x0000020908368E08>] >>> ax.plot(x2,y2,color='r',label='3D 线性图二') [<mpl_toolkits.mplot3d.art3d.Line3D object at 0x000002090836F2C8>] >>> ax.set_title('绘制 3D 线性图示例',pad=15,fontsize='12') Text(0.5, 0.92, '绘制 3D 线性图示例') >>> ax.set_xlabel('x 轴',color='r',fontsize='12') Text(0.5, 0, 'x 轴') >>> ax.set_ylabel('y 轴',color='g',fontsize='12') Text(0.5, 0, 'y 轴') >>> ax.set_zlabel('z 轴',color='b',fontsize='12') Text(0.5, 0, 'z 轴') >>> ax.legend() <matplotlib.legend.Legend object at 0x000002097FF68648> >>> plt.show()#结果见下图

    >>> import numpy as np >>> import matplotlib.pyplot as plt >>> plt.rcParams['font.sans-serif']=['Microsoft YaHei'] >>> fig=plt.figure() >>> ax=fig.gca(projection='3d') >>> theta=np.linspace(-4*np.pi,4*np.pi,100) >>> z1=np.linspace(-2,2,100) >>> r=z1**2+1 >>> x1=r*np.sin(theta) >>> y1=r*np.cos(theta) >>> z2=np.linspace(-3,3,100) >>> x2=np.sin(z2) >>> y2=np.cos(z2) >>> ax.plot(x1,y1,zdir="x",color='b',label='3D 线性图一') [<mpl_toolkits.mplot3d.art3d.Line3D object at 0x000002ACC5FC9E88>] >>> ax.plot(x2,y2,zdir="y",color='r',label='3D 线性图二') [<mpl_toolkits.mplot3d.art3d.Line3D object at 0x000002ACC5FC9E48>] >>> ax.set_title('绘制 3D 线性图示例',pad=15,fontsize='12') Text(0.5, 0.92, '绘制 3D 线性图示例') >>> ax.set_xlabel('x 轴',color='r',fontsize='12') Text(0.5, 0, 'x 轴') >>> ax.set_ylabel('y 轴',color='g',fontsize='12') Text(0.5, 0, 'y 轴') >>> ax.set_zlabel('z 轴',color='b',fontsize='12') Text(0.5, 0, 'z 轴') >>> ax.legend() <matplotlib.legend.Legend object at 0x000002ACC27ADA88> >>> plt.show()#结果见下图

    3.绘制3D散点图: 其他属性参见: https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.scatter.html

    <ax3d>.scatter(<xs>,<ys>[,<zs>,zdir="z",s=20,c=None,depthshade=True,**kwargs]) #参数说明:ax3d/xs/ys/zs/zdir同<ax3d>.plot();None表示默认值来自全局配置或没有 s:指定标记的大小;为数组/标量 c:指定标记的颜色,支持英文名称/简写/16进制颜色码;str/str list depthshade:指定是否为散点标记着色以提供深度外观;bool kwargs:指定其他属性 #实例: >>> import numpy as np >>> import matplotlib.pyplot as plt >>> plt.rcParams['font.sans-serif']=['Microsoft YaHei'] >>> plt.show() >>> fig=plt.figure() >>> ax=fig.gca(projection="3d") >>> n=100 >>> def randrange(n,vmin,vmax): ... return (vmax-vmin)*np.random.rand(n)+vmin ... >>> for m,zlow,zhigh in [('o',-50,-25),('^',-30,-5)]: ... xs=randrange(n,23,32) ... ys=randrange(n,0,100) ... zs=randrange(n,zlow,zhigh) ... ax.scatter(xs,ys,zs,marker=m) ... <mpl_toolkits.mplot3d.art3d.Path3DCollection object at 0x000002ACC71E0608> <mpl_toolkits.mplot3d.art3d.Path3DCollection object at 0x000002ACC71E0DC8> >>> ax.set_title('绘制 3D 散点图示例',pad=15,fontsize='12') Text(0.5, 0.92, '绘制 3D 散点图示例') >>> ax.set_xlabel('x 轴',color='b') Text(0.5, 0, 'x 轴') >>> ax.set_ylabel('y 轴',color='b') Text(0.5, 0, 'y 轴') >>> ax.set_zlabel('z 轴',color='b') Text(0.5, 0, 'z 轴') >>> plt.show()#结果见下图

    4.绘制3D线框图: 其他属性参见: https://matplotlib.org/api/_as_gen/mpl_toolkits.mplot3d.art3d.Line3DCollection.html

    <ax3d>.plot_wireframe(<X>,<Y>,<Z>[,**kwargs]) #参数说明: X,Y,Z:分别指定数据点的x/y/z坐标;均为2维数组 kwargs:指定其他属性 #实例: >>> import numpy as np >>> import matplotlib.pyplot as plt >>> plt.rcParams['font.sans-serif']=['Microsoft YaHei'] >>> fig=plt.figure() >>> ax=fig.add_subplot(111,projection='3d') >>> def f(m, n): ... return np.sin(np.sqrt(m ** 2 + n ** 2)) ... >>> x=np.linspace(-6,6,30) >>> y=np.linspace(-6,6,30) #生成网格点坐标矩阵: >>> X,Y=np.meshgrid(x,y) >>> Z=f(X,Y) #绘制3D线框图: >>> ax.plot_wireframe(X,Y,Z,color='c') <mpl_toolkits.mplot3d.art3d.Line3DCollection object at 0x0000022FA7B65488> >>> ax.set_title('绘制 3D 线框图示例',pad=15,fontsize='12') Text(0.5, 0.92, '绘制 3D 线框图示例') >>> ax.set_xlabel('x 轴') Text(0.5, 0, 'x 轴') >>> ax.set_ylabel('y 轴') Text(0.5, 0, 'y 轴') >>> ax.set_zlabel('z 轴') Text(0.5, 0, 'z 轴') >>> plt.show()#结果见下图

    5.绘制3D曲面图 (1)绘制3D曲面图: 其他参数参见: https://matplotlib.org/api/_as_gen/mpl_toolkits.mplot3d.art3d.Line3DCollection.html

    <ax3d>.plot_surface(<X>,<Y>,<Z>[,color=None,vmin=None,vmax=None,**kwargs]) #参数说明:ax3d同<ax3d>.plot();None表示默认值来自全局配置或没有 X,Y,Z:分别指定数据点的x/y/z坐标;均为2维数组 color:指定曲面表面的颜色 vmin,vmax:指定数据界限 kwargs:指定其他参数 #实例: >>> import numpy as np >>> import matplotlib.pyplot as plt >>> plt.rcParams['font.sans-serif']=['Microsoft YaHei'] >>> fig=plt.figure() >>> ax=fig.add_subplot(111,projection='3d') >>> X=np.arange(-5,5,0.25) >>> Y=np.arange(-5,5,0.25) >>> X,Y=np.meshgrid(X,Y) >>> R=np.sqrt(X**2+Y**2) >>> Z=np.sin(R) #绘制3D曲面图并添加色条(长度0.8) >>> surface=ax.plot_surface(X,Y,Z,cmap='rainbow',antialiased=False) >>> fig.colorbar(surface,shrink=0.8) <matplotlib.colorbar.Colorbar object at 0x0000017B16112748> >>> ax.set_title('绘制 3D 曲面图示例',pad=15,fontsize='12') Text(0.5, 0.92, '绘制 3D 曲面图示例') >>> ax.set_xlabel('x 轴') Text(0.5, 0, 'x 轴') >>> ax.set_ylabel('y 轴') Text(0.5, 0, 'y 轴') >>> ax.set_zlabel('z 轴') Text(0.5, 0, 'z 轴') #调整观察角度和方位角,俯仰角25度,方位角40度: >>> ax.view_init(25, 40) #设置z轴刻度界限: >>> ax.set_zlim(-2,2) (-2.0, 2.0) >>> plt.show()#结果见下图

    (2)绘制3D三角曲面图: 其他参数参见: https://matplotlib.org/api/_as_gen/mpl_toolkits.mplot3d.art3d.Poly3DCollection.html

    <ax3d>.plot_trisurf(<X>,<Y>,<Z>[,color=None,vmin=None,vmax=None,**kwargs]) #参数说明:其他参数同<ax3d>.plot_surface();None表示默认值来自全局配置或没有 kwargs:指定其他参数 #实例: >>> import matplotlib.pyplot as plt >>> import numpy as np >>> plt.rcParams['font.sans-serif']=['Microsoft YaHei'] >>> fig=plt.figure() >>> ax=fig.add_subplot(111,projection='3d') >>> n_radii=8 >>> n_angles=36 >>> radii=np.linspace(0.125,1.0,n_radii) >>> angles=np.linspace(0,2*np.pi,n_angles,endpoint=False)[..., np.newaxis] >>> x=np.append(0,(radii*np.cos(angles)).flatten()) >>> y=np.append(0,(radii*np.sin(angles)).flatten()) >>> z=np.sin(-x*y) #绘制3D三角曲面图并添加色条(长度0.8): >>> trisurf=ax.plot_trisurf(x,y,z,cmap='rainbow') >>> fig.colorbar(trisurf,shrink=0.8) <matplotlib.colorbar.Colorbar object at 0x0000026480BF2FC8> >>> ax.set_title('绘制 3D 三角曲面图示例', pad=15, fontsize='12') Text(0.5, 0.92, '绘制 3D 三角曲面图示例') >>> ax.set_xlabel('x 轴') Text(0.5, 0, 'x 轴') >>> ax.set_ylabel('y 轴') Text(0.5, 0, 'y 轴') >>> ax.set_zlabel('z 轴') Text(0.5, 0, 'z 轴') >>> plt.show()#结果见下图

    6.绘制3D柱状图: 其他参数参见: https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.bar.html

    <ax3d>.bar(<left>,<height>[,zs=0,zdir='z',**kwargs]) #参数说明:ax3d/zdir同<ax3d>.plot() left:指定矩形的x坐标;1维数组 height:指定矩形的y坐标;1维数组 zs:指定矩形的z坐标;1维数组/标量 kwargs:指定其他参数 #实例: >>> import matplotlib.pyplot as plt >>> import numpy as np >>> plt.rcParams['font.sans-serif']=['Microsoft YaHei'] >>> fig=plt.figure() >>> ax=fig.add_subplot(111,projection='3d') >>> colors=['r','g','b','y'] >>> yticks=[3,2,1,0] >>> for c,k in zip(colors,yticks): ... xs=np.arange(20) ... ys=np.random.rand(20) ... cs=[c]*len(xs) ... ax.bar(xs,ys,zs=k,color=cs,alpha=0.8) ... <BarContainer object of 20 artists> <BarContainer object of 20 artists> <BarContainer object of 20 artists> <BarContainer object of 20 artists> >>> ax.set_title('绘制 3D 柱状图示例',pad=15,fontsize='12') Text(0.5, 0.92, '绘制 3D 柱状图示例') >>> ax.set_xlabel('X 轴') Text(0.5, 0, 'X 轴') >>> ax.set_ylabel('Y 轴') Text(0.5, 0, 'Y 轴') >>> ax.set_zlabel('Z 轴') Text(0.5, 0, 'Z 轴') >>> ax.set_yticks(yticks) [<matplotlib.axis.XTick object at 0x0000014F5E7CBF48>, <matplotlib.axis.XTick object at 0x0000014F5E7A5FC8>, <matplotlib.axis.XTick object at 0x0000014F5DDC47C8>, <matplotlib.axis.XTick object at 0x0000014F5DE488C8>] >>> plt.show()#结果见下图

    7.绘制3D箭形图: 其他参数参见: https://matplotlib.org/api/collections_api.html#matplotlib.collections.LineCollection

    <ax3d>.quiver(<X>,<Y>,<Z>,<U>,<V>,<W>[,length=1,arrow_length_ratio=0.3,pivot='tail',normalize=False,**kwargs]) #参数说明: X,Y,Z:指定箭形尾部的x/y/z坐标;1维数组 U,V,W:指定箭形向量在x/y/z轴上的分量;1维数组/标量 ???length:指定箭筒的长度;float arrow_length_ratio:指定箭头相对于这个箭身的比率;float pivot:说明由X/Y/Z指定的位置是箭形哪部分的位置 #箭头将绕该点旋转 可为"tail"(默认值;尾部)/"middle"(中间)/"tip"(头部) ???normalize:指定箭形长度的策略 为True,则所有箭头的长度都相同 为False,则箭头的长度取决于U/V/W kwargs:指定其他参数 #实例: >>> import matplotlib.pyplot as plt >>> fig=plt.figure() >>> ax=fig.gca(projection='3d') >>> ax.quiver([1],[1],[1],[0.01],[0],[0]) <mpl_toolkits.mplot3d.art3d.Line3DCollection object at 0x0000022231CEDFC8> >>> ax.quiver([1],[1],[1],[0],[0.01],[0]) <mpl_toolkits.mplot3d.art3d.Line3DCollection object at 0x0000022231CFD488> >>> ax.quiver([1],[1],[1],[0],[0],[0.01]) <mpl_toolkits.mplot3d.art3d.Line3DCollection object at 0x0000022231CFD448> >>> plt.show()#结果见下图

    >>> import matplotlib.pyplot as plt >>> fig=plt.figure() >>> ax=fig.gca(projection='3d') >>> ax.quiver([1],[1],[1],0.01,0.01,0.01,pivot="tip") <mpl_toolkits.mplot3d.art3d.Line3DCollection object at 0x0000022FC67D0908> >>> plt.show()

    >>> import matplotlib.pyplot as plt >>> import numpy as np >>> plt.rcParams['font.sans-serif']=['Microsoft YaHei'] >>> fig=plt.figure() >>> ax=fig.gca(projection='3d') >>> x,y,z=np.meshgrid(np.arange(-0.8,1,0.2), ... np.arange(-0.8,1,0.2), ... np.arange(-0.8,1,0.8)) >>> u=np.sin(np.pi*x)*np.cos(np.pi*y)*np.cos(np.pi*z) >>> v=-np.cos(np.pi*x)*np.sin(np.pi*y)*np.cos(np.pi*z) >>> w=(np.sqrt(2.0/3.0)*np.cos(np.pi*x)*np.cos(np.pi*y)*np.sin(np.pi*z)) >>> ax.quiver(x,y,z,u,v,w,length=0.1,normalize=True) <mpl_toolkits.mplot3d.art3d.Line3DCollection object at 0x000001BBFE18FBC8> >>> ax.set_title('绘制 3D 箭头图示例',pad=15,fontsize='12') Text(0.5, 0.92, '绘制 3D 箭头图示例') >>> ax.set_xlabel('X 轴') Text(0.5, 0, 'X 轴') >>> ax.set_ylabel('Y 轴') Text(0.5, 0, 'Y 轴') >>> ax.set_zlabel('Z 轴') Text(0.5, 0, 'Z 轴') #调整观察角度,俯仰角20度: >>> ax.view_init(20) >>> plt.show()#结果见下图

    8.绘制3D等高线图: (1)绘制3D等高线图:

    <ax3d>.contour(<X>,<Y>,<Z>[,extend3d=False,stride=5,zdir='z',offset=None,**kwargs]) #参数说明:ax3d/zdir同<ax3d>.plot() X,Y,Z:分别指定数据点的x/y/z坐标; extend3d:指定是否以3D延伸等高线;bool #即:是否向上下延伸等高线 ???stride:指定延伸轮廓的步长;int #实际效果为:stride越小,曲线越平滑 #该参数仅在extend3d=True,offset=None时生效 offset:指定在垂直于zdir且值为offset的平面上绘制轮廓线的投影而不再绘制等高线 None表示不绘制投影而绘制等高线 #extend3d=True会使该参数失效,永远绘制等高线 kwargs:指定其他参数 #实例: >>> import numpy as np >>> import matplotlib.pyplot as plt >>> fig=plt.figure(figsize=(8,4.8)) >>> ax=fig.add_subplot(111,projection='3d') >>> X=np.arange(-2.0,2.0,0.01) >>> Y=np.arange(-2.0,2.0,0.01) >>> m,n=np.meshgrid(X,Y) >>> def f(a,b): ... return (1-b**5+a**5)*np.exp(-a**2-b**2) ... >>> contour=ax.contour(X,Y,f(m,n),cmap='rainbow') >>> fig.colorbar(contour,shrink=0.8) >>> plt.show()#结果见下图1 >>> contour=ax.contour(X,Y,f(m,n),cmap='rainbow',extend3d=True) >>> fig.colorbar(contour,shrink=0.8) <matplotlib.colorbar.Colorbar object at 0x000001DC7D6169C8> >>> plt.show()#结果见下图2 >>> contour=ax.contour(X,Y,f(m,n),cmap='rainbow',extend3d=True,stride=100) >>> fig.colorbar(contour,shrink=0.8) <matplotlib.colorbar.Colorbar object at 0x000001DC01A52B48> >>> plt.show()#结果见下图3 >>> contour=ax.contour(X,Y,f(m,n),cmap='rainbow',offset=0.5) >>> fig.colorbar(contour,shrink=0.8) <matplotlib.colorbar.Colorbar object at 0x000001DC01C81908> >>> plt.show()#结果见下图4

    (2)绘制3D等高线填充图: 其他参数参见: https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.contourf.html

    <ax3d>.contourf(<X>,<Y>,<Z>[,zdir='z',offset=None,**kwargs]) #参数说明:其他参数同<ax3d>.contour() kwargs:指定其他参数 #实例: >>> import numpy as np >>> import matplotlib.pyplot as plt >>> fig=plt.figure(figsize=(8,4.8)) >>> ax=fig.add_subplot(111,projection='3d') >>> X=np.arange(-2.0,2.0,0.01) >>> Y=np.arange(-2.0,2.0,0.01) >>> m,n=np.meshgrid(X,Y) >>> def f(a,b): ... return (1-b**5+a**5)*np.exp(-a**2-b**2) ... >>> fig.colorbar(contourf, shrink=0.8) >>> plt.show()

    Processed: 0.009, SQL: 9