一、实验介绍

1.1 实验内容

Matplotlib 是支持 Python 语言的开源绘图库,因为其支持丰富的绘图类型、简单的绘图方式以及完善的接口文档,深受 Python 工程师、科研学者、数据工程师等各类人士的喜欢。这是 Matplotlib 绘图课程的第 3 章节,将带你了解 3D 图像绘制。

1.2 实验知识点

  • Matplotlib 绘制 3D 图像

1.3 实验环境

  • python2.7
  • Xfce 终端
  • ipython 终端

1.4 适合人群

本课程难度为一般,属于初级级别课程,适合具有 Python 基础,并对使用 Matplotlib 绘图感兴趣的用户。

二、三维绘图

2.1 mplot3d 绘图模块介绍

前面,我们已经了解了如果使用 Matplotlib 中的 pyplot 模块绘制简单的 2D 图像。其实,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

由于 Axes3D() 十分常用,所以 Matplotlib 支持更加方便地导入。

from mpl_toolkits.mplot3d import Axes3D

2.2 三维散点图

接下来,通过一个简单的例子,来看一看绘制三维图像具体需要几个步骤。代码均在 ipython 终端执行,你可以通过在线环境左下角的应用程序菜单 > 附件打开。

首先,我们导入 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()

除开生成数据和模块导入,实际上只用了 4 行短小的代码就绘制出了一幅三维散点图像。

你可以通过鼠标拖动图像,从不同的视角查看该 3D 图像。

2.3 三维线型图

线形图和散点图相似,需要传入 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()

2.4 三维柱状图

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

# 载入模块
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()

这里在 ipython 终端中输入时,注意代码的缩进。

2.5 三维图曲面图

接下来需要绘制的三维曲面图要麻烦一些,我们需要对数据进行矩阵处理。其实和画二维等高线图很相似,只是多增加了一个维度。

# 载入模块
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 配色方案,也就是下图的渐变色。

2.6 混合图绘制

混合图就是将两种不同类型的图绘制在一张图里。绘制混合图一般有前提条件,那就是两种不同类型图的范围大致相同,否则将会出现严重的比例不协调,而使得混合图失去意义。

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

2.7 子图绘制

前面的章节已经介绍了二维子图的绘制,其实三维情况下也是一样的。我们可以将二维图像和三维图像绘制在一起,又或者将几个三维图像绘制在一起。

这里我们就拿上面绘制过的线形图和曲面图为例,看一看需要增删哪些代码。

# -*- 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' 参数。

三、实验总结

本次实验主要是学会如果使用 Matplotlib 完成简单的 3D 绘图。你会发现,三维绘图其实就是在二维绘图上的演变。二者的区别重点在两个方面,首先需要建一个了三维画布,其次需要多输入一个维度值,即 z 值。

在 Matplotlib 中,它们之间会共享一些参数。例如,当你在三维空间中绘制线型图时,二维图中对线的颜色、粗细、标记点的样式等参数均可直接使用。

Matplotlib 绘图教程(3D)相关推荐

  1. Python数据可视化之matplotlib绘图教程

    目录 一.快速绘图 1. 折线图 2. 柱状图 3. 饼状图 4. 散点图 5. 图片保存 二.基本设置 1. 图片 2. 坐标轴 3. 刻度 4. 边距 5. 图例 6. 网格 7. 标题 8. 文 ...

  2. matplotlib基础教程-3D绘图(2)

    基本3D图的绘制 Matplotlib 已经内置了三维图形,所以我们只需要引入这些完整的模块就可以了: from mpl_toolkits.mplot3d import axes3d import m ...

  3. python中numpy matplotlib绘图教程_利用numpy+matplotlib绘图的基本操作教程

    简述 Matplotlib是一个基于python的2D画图库,能够用python脚本方便的画出折线图,直方图,功率谱图,散点图等常用图表,而且语法简单.具体介绍见matplot官网. Numpy(Nu ...

  4. matplotlib绘图教程

    import numpy as np import matplotlib.pyplot as pltnp.random.seed(2) y = np.random.random(10) z = np. ...

  5. matplotlib——3D绘图教程

    开始 绘制曲线 绘制散点图 改变图像角度 声明: 本文参考自matplotlib官方教程 介绍了3D曲线图和散点图的绘制,以后可能会添加更复杂图形的绘制方法. 开始   使用matplotlib绘制3 ...

  6. Python绘图之matplotlib基础教程:matplotlib库图表绘制中常规设置大全(交互模式、清除原有图像、设置横坐标显示文字/旋转角度、添加图例、绘图布局自动调整、图像显示、图像暂停)

    Python绘图之matplotlib基础教程:matplotlib库图表绘制中常规设置大全(交互模式.清除原有图像.设置横坐标显示文字/旋转角度.添加图例.绘图布局自动调整.图像显示.图像暂停) 目 ...

  7. FreeCAD 3D绘图教程

    推荐:将 NSDT场景编辑器 加入你的3D开发工具链 构建现实世界 FreeCAD主要用于为现实世界设计对象.您在FreeCAD中所做的一切都使用现实世界的单位,无论是微米,公里,英寸还是英尺,甚至是 ...

  8. python 3d绘图 汉字_完美解决Python matplotlib绘图时汉字显示不正常的问题

    Matplotlib是一个很好的作图软件,但是python下默认不支持中文,所以需要做一些修改,方法如下: 1.在python安装目录的Lib目录下创建ch.py文件. 文件中代码为: 保存,以后通过 ...

  9. python,matplotlib绘图基本操作美化教程

    这次来整理一波python用matplotlib绘图的常用函数,以及如何修改默认死亡配色. 前期准备 导入包 import numpy as np import pandas as pd import ...

最新文章

  1. 练习 MongoDB 操作 —— 分片篇(五)
  2. 独家 | 国内AI专业高考报考指南
  3. 【深度学习】谷歌大脑EfficientNet的工作原理解析
  4. leetcode 136. Single Number
  5. php mssql image,php5连接mssql2005数据库表中的image字段图片显示
  6. CodeForces - 1459D Glass Half Spilled(dp)
  7. 64 源码_【ClickHouse内核】源码阅读策略
  8. python 数据分析库_五个 Python 常用数据分析库
  9. 这10个功能模块,手把手教你从零设计电商系统
  10. ruby 批量下载王者荣耀皮肤
  11. 50岁开始学python_再过两年C语言就50岁了,这么老的编程语言怎么还没有过时?...
  12. stringbuilder为什么线程不安全_String Builder 为什么线程不安全?
  13. Codeforces 631E 斜率优化
  14. python使用mq-fw包
  15. 通过docker搭建Yapi
  16. 人力资源管理专业知识与实务(初级)【2】
  17. md5 java实现与在线工具结果不符_「md5在线解密」使用MD5在线加解密工具,对汉字进行加密,得到不同的结果 - seo实验室...
  18. 阿额企鹅我恶趣味企鹅我去恶趣味
  19. android md5加密登录,Android开发之MD5加密
  20. asn1编码格式的解析过程

热门文章

  1. vulnhub-HOGWARTS: DOBBY
  2. 计算机基础知识论文统一格式,计算机基础论文范文
  3. EVE-NG模拟器安装抓包模块部署
  4. CAN LOOKBACK实验代码
  5. ORIGYN 基金会与欧洲足联儿童基金会合作,推出“NFTs for Good”计划
  6. java面试题下载_java面试题大全 打包 下载
  7. QML TextEdit 语法高亮显示
  8. 解决Unity旧版Text文本模糊的问题!
  9. 微型计算机地基本结构,微型计算机的基本结构
  10. python中文朗读_在电脑使用讯飞有声,通过python自动化朗读