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基础之内置函数和递归
Jun 21 Python
python+matplotlib绘制旋转椭圆实例代码
Jan 12 Python
python实现守护进程、守护线程、守护非守护并行
May 05 Python
python 高效去重复 支持GB级别大文件的示例代码
Nov 08 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
Jan 30 Python
python根据txt文本批量创建文件夹
Dec 08 Python
PYTHON EVAL的用法及注意事项解析
Sep 06 Python
python打印直角三角形与等腰三角形实例代码
Oct 20 Python
Python爬取梨视频的示例
Jan 29 Python
python 获取计算机的网卡信息
Feb 18 Python
如何理解python接口自动化之logging日志模块
Jun 15 Python
python入门学习关于for else的特殊特性讲解
Nov 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
将数组写入txt文件 var_export
2009/04/21 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
从javascript语言本身谈项目实战
2006/12/27 Javascript
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
JS回调函数深入理解
2019/10/16 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
js实现微信聊天效果
2020/08/09 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
python使用str & repr转换字符串
2016/10/13 Python
Python max内置函数详细介绍
2016/11/17 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
自荐信封面
2013/12/04 职场文书
社团成立邀请函
2014/01/08 职场文书
初三学生评语大全
2014/04/24 职场文书
护士感人事迹
2014/05/01 职场文书
电子商务求职信
2014/06/15 职场文书
聘用意向书
2014/07/29 职场文书
村道德模范事迹材料
2014/08/28 职场文书
优秀党员事迹材料
2014/12/18 职场文书
听证通知书
2015/04/24 职场文书
党支部半年考察意见
2015/06/01 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python