您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页python中Matplotlib实现绘制3D图的示例代码

python中Matplotlib实现绘制3D图的示例代码

来源:华佗小知识
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()。from mpl_toolkits.mplot3d.axes3d import Axes3D或from mpl_toolkits.mplot3d import Axes3D三维散点图

⾸先,我们导⼊ numpy 随机⽣成⼀组数据。

import numpy as np

# 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 绘图模块。

from mpl_toolkits.mplot3d import Axes3Dimport matplotlib.pyplot as plt

第⼆步,使⽤ Axes3D() 创建 3D 图形对象。

fig = plt.figure()ax = Axes3D(fig)

最后,调⽤散点图绘制⽅法绘图并显⽰出来。

ax.scatter(x, y, z)plt.show()

三维线型图

线形图和散点图相似,需要传⼊ x, y, z 三个坐标的数值。详细的代码如下。

# 载⼊模块

from mpl_toolkits.mplot3d import Axes3Dimport matplotlib.pyplot as pltimport numpy as np

# ⽣成数据

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

三维柱状图

绘制完线型图,我们继续尝试绘制三维柱状图,其实它的绘制步骤和上⾯同样⾮常相似。

# 载⼊模块

from mpl_toolkits.mplot3d import Axes3Dimport matplotlib.pyplot as pltimport numpy as np# 创建 3D 图形对象fig = plt.figure()ax = Axes3D(fig)

# ⽣成数据并绘图x = [0, 1, 2, 3, 4, 5, 6]for i in x:

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

三维图曲⾯图

接下来需要绘制的三维曲⾯图要⿇烦⼀些,我们需要对数据进⾏矩阵处理。其实和画⼆维等⾼线图很相似,只是多增加了⼀个维度。

# 载⼊模块

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D# 创建 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 -*# 载⼊模块

from mpl_toolkits.mplot3d import Axes3Dimport numpy as np

import matplotlib.pyplot as plt# 创建 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 -*# 载⼊模块

from mpl_toolkits.mplot3d import Axes3Dimport matplotlib.pyplot as pltimport numpy as np# 创建 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'参数。以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务