Python matplotlib 绘制3D图
前言
在matplotlib模块最初的时候只支持绘制2D图形,例如我们之前也学习过绘制折线图、柱状图、直方图等统计图表,同时也学习绘制多个子图、常见图形等。如下例举往期文章,可供参考
随着技术发展,matplotlib模块在2D绘制的基础,封装出实用的3D绘制工具包mplot3d来支持我们更快地绘制3D图形。
本期,我们将详细学习3D绘制模块mplot3d相关绘制方法,Let's go~
1. mplot3d 概述
mplot3d库是matplotlib模块中专门针对绘制3D图像所提供的2D投影的Axes对象,为Matplotlib 增加了可以绘制散点图、曲面图、折线图、网格等。
-
mplot3d 特点
- mplot3d 允许用户创建matplotlib 2D绘图的简单3D图形
- mplot3d 方法易上手,直接可以使用2D方法进行绘制
- mplot3d 绘制3D图像与2D图像共用同的渲染引擎,可能会出现Z轴投影出现偏差
- mplot3d 样式可以通过更改参数来进行个性化修改
-
mplot3d 使用
我们在使用mplot3d工具包时,需要额外使用from...import来导入Axes3D类
from mpl_toolkits.mplot3d import Axes3D
PS:
- pyplot类无法进行3D绘图添加内容、处理3D附加信息等,必须要使用Axes3D对象来进行创建
- mplot3d 绘制3D图形方法还不太成熟,对于复杂的3D图场景,建议使用Mayavi
2. 绘制3D图形步骤
在 matplotlib 模块中提供绘制3D图形需要mplot3d中Axes3D对象与pyplot方法结合使用,因此绘制3D图形有如下步骤
- 导入matplotlib.pyplot和mpl_toolkits.mplot3d中Axes3D类
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
- 使用Pyplot.figure创建一个fig画布对象
fig = plt.figure()
-
在fig画布中创建一个带3D坐标的Axes对象
- 方式一:使用创建子图通过projection='3D'来创建
ax = fig.add_subplot(projection='3d')
- 方式二:调用Axes3D类来创建对象
ax = Axes3D(fig)
-
调用numpy.random或者numpy.arange()等方法准备x,y轴数据
x = np.arange(-5,5,0.25)
y = np.arange(-5,5,0.25)
- 调用numpy.meshgrid()方法对x,y进行映射矩阵
x,y = np.meshgrid(x,y)
- 根据x,y矩阵数据按需求进行计算求出Z轴数据,例如调用numpy.sin()、cos()函数
R = np.sqrt(x**2+y**2)
z = np.cos(R)
- Axes对象调用pyplot绘制图表、图形的方法绘制,例如调用等高线图contour、曲面plot_surface()
ax.plot_surface(x,y,z,rstride=1,cstride=1,alpha=0.5,cmap=cm.coolwarm)
ax.contour(x,y,z,zdir='z',offset=-2)
- Axes对象调用xlim,ylim,zlim方法设置x,y,z轴取值范围
ax.set_zlim(-2,2)
- 最后调用pyplot.show()展示出绘制的图像
plt.show()
- 展示的效果如图
3. 绘制3D散点图
- 使用numpy.arange()|numpy.random.randint()准备x,y,z轴的数据
- Axes对象调用scatter散点图方法绘制散点图
x = np.arange(0,200)
y = np.arange(0,100)
x,y = np.meshgrid(x,y)
z = np.random.randint(0,200,size=(100,200))
yc = np.arctan2(x,y)
ax.scatter(x,y,z,c=yc,s=50,marker=".")
4. 绘制3D折线图
- 使用np.linspace()和np.sin()对x,y轴数据准备
- Axes对象调用plot()折线方法绘制折线图
x = np.linspace(0,1,100)
y = np.sin(x*2*np.pi)/2+0.5
ax.plot(x,y,zs=0,zdir="z")
5. 绘制3D柱状图
for z in range(0,3):
x = np.arange(1,13)
y = 1000*np.random.rand(12)
color = plt.cm.Set2(random.choice(range(plt.cm.Set2.N)))
ax.bar(x,y,zs=z,zdir="y",color=color,alpha=0.8)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
总结
本期,对matplotlib 模块提供mplot3d库绘制3D图形的步骤进行学习,同时手动实操散点图、折线、柱状图3D图。
对于,绘制3D图形必现要使用Axes3D对象进行绘制,对于复杂的3D图形matplotlib渲染引擎渲染比较差,官方建议使用Mayavi进行处理。
以上是本期内容,欢迎大佬们点赞评论,下期见~
转载自:https://juejin.cn/post/7032613690339754014