python中Matplotlib实现绘制3D图的示例代码
Matplotlib也可以绘制3D图像,与二维图像不同的是,绘制三维图像主要通过mplot3d模块实现。但是,使用Matplotlib绘制三维图像实际上是在二维画布上展示,所以一般绘制三维图像时,同样需要载入pyplot模块。
mplot3d模块下主要包含4个大类,分别是:
- mpl_toolkits.mplot3d.axes3d()
- mpl_toolkits.mplot3d.axis3d()
- mpl_toolkits.mplot3d.art3d()
- mpl_toolkits.mplot3d.proj3d()
其中,axes3d()下面主要包含了各种实现绘图的类和方法。axis3d()主要是包含了和坐标轴相关的类和方法。art3d()包含了一些可将2D图像转换并用于3D绘制的类和方法。proj3d()中包含一些零碎的类和方法,例如计算三维向量长度等。
一般情况下,我们用到最多的就是mpl_toolkits.mplot3d.axes3d()中的mpl_toolkits.mplot3d.axes3d.Axes3D()类,而Axes3D()下面又存在绘制不同类型3D图的方法。你可以通过下面的方式导入Axes3D()。
frommpl_toolkits.mplot3d.axes3dimportAxes3D或frommpl_toolkits.mplot3dimportAxes3D
三维散点图
首先,我们导入numpy随机生成一组数据。
importnumpyasnp #x,y,z均为0到1之间的100个随机数 x=np.random.normal(0,1,100) y=np.random.normal(0,1,100) z=np.random.normal(0,1,100)
接下来,开始绘图。第一步是载入2D,3D绘图模块。
frommpl_toolkits.mplot3dimportAxes3D importmatplotlib.pyplotasplt
第二步,使用Axes3D()创建3D图形对象。
fig=plt.figure() ax=Axes3D(fig)
最后,调用散点图绘制方法绘图并显示出来。
ax.scatter(x,y,z) plt.show()
三维线型图
线形图和散点图相似,需要传入x,y,z三个坐标的数值。详细的代码如下。
#载入模块 frommpl_toolkits.mplot3dimportAxes3D importmatplotlib.pyplotasplt importnumpyasnp #生成数据 x=np.linspace(-6*np.pi,6*np.pi,1000) y=np.sin(x) z=np.cos(x) #创建3D图形对象 fig=plt.figure() ax=Axes3D(fig) #绘制线型图 ax.plot(x,y,z) #显示图 plt.show()
三维柱状图
绘制完线型图,我们继续尝试绘制三维柱状图,其实它的绘制步骤和上面同样非常相似。
#载入模块 frommpl_toolkits.mplot3dimportAxes3D importmatplotlib.pyplotasplt importnumpyasnp #创建3D图形对象 fig=plt.figure() ax=Axes3D(fig) #生成数据并绘图 x=[0,1,2,3,4,5,6] foriinx: y=[0,1,2,3,4,5,6,7,8,9] z=abs(np.random.normal(1,10,10)) ax.bar(y,z,i,zdir='y',color=['r','g','b','y']) plt.show()
三维图曲面图
接下来需要绘制的三维曲面图要麻烦一些,我们需要对数据进行矩阵处理。其实和画二维等高线图很相似,只是多增加了一个维度。
#载入模块 importnumpyasnp importmatplotlib.pyplotasplt frommpl_toolkits.mplot3dimportAxes3D #创建3D图形对象 fig=plt.figure() ax=Axes3D(fig) #生成数据 X=np.arange(-2,2,0.1) Y=np.arange(-2,2,0.1) X,Y=np.meshgrid(X,Y) Z=np.sqrt(X**2+Y**2) #绘制曲面图,并使用cmap着色 ax.plot_surface(X,Y,Z,cmap=plt.cm.winter) plt.show()
cmap=plt.cm.winter表示采用了winter配色方案,也就是下图的渐变色。
混合图绘制
混合图就是将两种不同类型的图绘制在一张图里。绘制混合图一般有前提条件,那就是两种不同类型图的范围大致相同,否则将会出现严重的比例不协调,而使得混合图失去意义。
#-*-coding:utf-8-* #载入模块 frommpl_toolkits.mplot3dimportAxes3D importnumpyasnp importmatplotlib.pyplotasplt #创建3D图形对象 fig=plt.figure() ax=Axes3D(fig) #生成数据并绘制图1 x1=np.linspace(-3*np.pi,3*np.pi,500) y1=np.sin(x1) ax.plot(x1,y1,zs=0,c='red') #生成数据并绘制图2 x2=np.random.normal(0,1,100) y2=np.random.normal(0,1,100) z2=np.random.normal(0,1,100) ax.scatter(x2,y2,z2) #显示图 plt.show()
子图绘制
#-*-coding:utf-8-* #载入模块 frommpl_toolkits.mplot3dimportAxes3D importmatplotlib.pyplotasplt importnumpyasnp #创建1张画布 fig=plt.figure() #=============== #向画布添加子图1 ax1=fig.add_subplot(1,2,1,projection='3d') #生成子图1数据 x=np.linspace(-6*np.pi,6*np.pi,1000) y=np.sin(x) z=np.cos(x) #绘制第1张图 ax1.plot(x,y,z) #=============== #向画布添加子图2 ax2=fig.add_subplot(1,2,2,projection='3d') #生成子图2数据 X=np.arange(-2,2,0.1) Y=np.arange(-2,2,0.1) X,Y=np.meshgrid(X,Y) Z=np.sqrt(X**2+Y**2) #绘制第2张图 ax2.plot_surface(X,Y,Z,cmap=plt.cm.winter) #显示图 plt.show()
我们可以来看一下这些代码。由于两张子图是绘制在1张画布上面的,所以这里需要提前创建1张画布。然后通过.add_subplot()添加子图,子图序号和二维绘图相似,只是注意3D绘图时要添加projection='3d'参数。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。