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使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
Python将json文件写入ES数据库的方法
Apr 10 Python
Python 3.8中实现functools.cached_property功能
May 29 Python
django最快程序开发流程详解
Jul 19 Python
Python3 chardet模块查看编码格式的例子
Aug 14 Python
Python 实现递归法解决迷宫问题的示例代码
Jan 12 Python
Python定义函数实现累计求和操作
May 03 Python
Python Scrapy图片爬取原理及代码实例
Jun 12 Python
Python经典五人分鱼实例讲解
Jan 04 Python
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
Oct 16 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
使用PHP实现密保卡功能实现代码<打包下载直接运行>
2011/10/09 PHP
php中define用法实例
2015/07/30 PHP
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
javawscript 三级菜单的实现原理
2009/07/01 Javascript
javascript 写类方式之七
2009/07/05 Javascript
jquery下json数组的操作实现代码
2010/08/09 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
JS+CSS简单树形菜单实现方法
2015/09/12 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
js编写简单的计时器功能
2017/07/15 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
python实现桌面气泡提示功能
2019/07/29 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
石油大学毕业生自荐信
2014/01/28 职场文书
《雨霖铃》听课反思
2014/02/13 职场文书
诚信考试倡议书
2014/04/15 职场文书
工程承包协议书
2014/04/22 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
工作证明英文模板
2014/10/21 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
学生会工作感言
2015/08/07 职场文书
少先队中队工作总结
2015/08/14 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
python中如何对多变量连续赋值
2021/06/03 Python
html5+实现plus.io进行拍照和图片等获取
2022/06/01 HTML / CSS