Python matplotlib 绘制3D图

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

前言

在matplotlib模块最初的时候只支持绘制2D图形,例如我们之前也学习过绘制折线图、柱状图、直方图等统计图表,同时也学习绘制多个子图、常见图形等。如下例举往期文章,可供参考

随着技术发展,matplotlib模块在2D绘制的基础,封装出实用的3D绘制工具包mplot3d来支持我们更快地绘制3D图形。

image.png

本期,我们将详细学习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()
复制代码
  • 展示的效果如图

image.png

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=".")
复制代码

image.png

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")
复制代码

image.png

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")
复制代码

image.png

总结

本期,对matplotlib 模块提供mplot3d库绘制3D图形的步骤进行学习,同时手动实操散点图、折线、柱状图3D图。

对于,绘制3D图形必现要使用Axes3D对象进行绘制,对于复杂的3D图形matplotlib渲染引擎渲染比较差,官方建议使用Mayavi进行处理。

以上是本期内容,欢迎大佬们点赞评论,下期见~

Guess you like

Origin juejin.im/post/7032613690339754014