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


Posted in Python onSeptember 04, 2017

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 Axes3D
import 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 Axes3D
import matplotlib.pyplot as plt
import 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 Axes3D
import matplotlib.pyplot as plt
import 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 Axes3D
import 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 Axes3D
import matplotlib.pyplot as plt
import 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'参数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python字符串和文件操作常用函数分析
Apr 08 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
matlab中实现矩阵删除一行或一列的方法
Apr 04 Python
python实现人人自动回复、抢沙发功能
Jun 08 Python
python实现比较文件内容异同
Jun 22 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
python读取并定位excel数据坐标系详解
Jun 26 Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 Python
python os.path.isfile 的使用误区详解
Nov 29 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
Jun 02 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
Python容器类型公共方法总结
Aug 19 Python
Python2实现的LED大数字显示效果示例
Sep 04 #Python
Python2随机数列生成器简单实例
Sep 04 #Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 #Python
Python基于回溯法子集树模板解决取物搭配问题实例
Sep 02 #Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 #Python
Python基于回溯法子集树模板解决0-1背包问题实例
Sep 02 #Python
基于python 字符编码的理解
Sep 02 #Python
You might like
zf框架的校验器InArray使用示例
2014/03/13 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
2016/11/21 PHP
jquery 分页控件实现代码
2009/11/30 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
js跳转页面方法总结
2014/01/29 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
js倒计时抢购实例
2015/12/20 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
Python获取文件ssdeep值的方法
2014/10/05 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
python如何将两个txt文件内容合并
2019/10/18 Python
python数据爬下来保存的位置
2020/02/17 Python
Python使用Socket实现简单聊天程序
2020/02/28 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
what is the difference between ext2 and ext3
2013/11/03 面试题
岗位职责定义及内容
2013/11/08 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
体育教师个人总结
2015/02/09 职场文书
幼儿园个人总结
2015/02/28 职场文书
主题班会开场白
2015/06/01 职场文书
保护环境建议书作文300字
2015/09/14 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android