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设计模式之工厂模式简单示例
Jan 09 Python
Python实现识别手写数字大纲
Jan 29 Python
Pycharm 操作Django Model的简单运用方法
May 23 Python
Django中使用Celery的教程详解
Aug 24 Python
Python 中的lambda函数介绍
Oct 10 Python
从0开始的Python学习016异常
Apr 08 Python
使用python的pandas为你的股票绘制趋势图
Jun 26 Python
opencv 查找连通区域 最大面积实例
Jun 04 Python
哪些是python中web开发框架
Jun 17 Python
python 5个顶级异步框架推荐
Sep 09 Python
Scrapy 配置动态代理IP的实现
Sep 28 Python
解决python3安装pandas出错的问题
May 20 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中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
JS 时间显示效果代码
2009/08/23 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
javascript学习之闭包分析
2010/12/02 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
python plotly绘制直方图实例详解
2019/07/22 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
实习销售业务员自我鉴定
2013/09/21 职场文书
入党申请书自我鉴定
2013/10/12 职场文书
个人收入证明范本
2014/01/12 职场文书
婚礼答谢宴主持词
2014/03/14 职场文书
关于责任的演讲稿
2014/05/20 职场文书
竞选学委演讲稿
2014/09/13 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
责任书格式
2015/01/29 职场文书
毕业生政审意见范文
2015/06/04 职场文书
寻找成龙观后感
2015/06/12 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
基于flask实现五子棋小游戏
2021/05/25 Python