matplotlib1.0版本之前其实是不支持3D图形绘制的。

后来的版本中,matplotlib加入了3D图形的支持,不仅仅是为了使数据的展示更加生动和有趣。
更重要的是,由于多了一个维度,扩展了其展示数据分布和关系的能力,可以一次从三个维度来比较数据。

下面介绍在matplotlib中绘制各类3D图形的方法。

1. 点和线

点和线类的图形转成3D比较简单,只要加个维度即可。
比如:

import numpy as np

import matplotlib
import matplotlib.pyplot as plt n = 10
xs = np.linspace(0, 100, n)
ys = np.linspace(100, 200, n) fig, ax = plt.subplots()
ax.scatter(xs, ys, color="r")
ax.plot(xs, ys) plt.show()

增加一个维度,改成3D图形:

n = 10
xs = np.linspace(0, 100, n)
ys = np.linspace(100, 200, n)
zs = xs + ys #增加一个维度,值为x+y的和 fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.scatter(xs, ys, zs, color='r')
ax.plot(xs, ys, zs) plt.show()


注意,获取子图的时候,subplot_kw={"projection": "3d"} 这个参数很重要,它会把坐标系映射成3维的。

2. 面

绘制面或者曲面的时候稍微复杂一些,不像点和面只要简单的增加一个维度就可以了。

比如,对于曲面函数:\(z = x*y^3 - y*x^3\)
绘制时,不能像如下这样:

xs = np.arange(-10, 10, 0.5)
ys = np.arange(-10, 10, 0.5)
zs = xs * (ys**3) - ys * (xs**3)

这样得到的xs, ys, zs只是3维中的一个个点的(x, y, z)坐标,无法绘制曲面。
只能像上一节那样绘制3维中的或者线

若要绘制曲面,需要用到numpy提供的meshgrid函数先生成网格。

xs = np.arange(-10, 10, 0.5)
ys = np.arange(-10, 10, 0.5)
xs, ys = np.meshgrid(xs, ys) #生成网格坐标 zs = xs * (ys**3) - ys * (xs**3) #计算网格中每个点的Z轴坐标

这样,把坐标传入plot_surface函数,就可以绘制最后的3D曲面了。

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.plot_surface(xs, ys, zs) plt.show()

只显示网格的话,可以用 plot_wireframe 函数。

ax.plot_wireframe(xs, ys, zs)

从这个示例可以看出,3D曲面其实是一个个网格拼接而成的,
并没有想象中的平滑,它的平滑程度取决于网格的大小和密度。

3. 立方体

matplotlib中提供了一个绘制立方体的函数voxels,通过这个函数可以很方便的绘制各种立方体形状。

我用voxels绘制了一个简易的金字塔结构:

x, y, z = np.indices((10, 10, 8))

cube1 = (x < 9) & (y < 9) & (z == 1)
cube2 = (x > 0) & (x < 8) & (y > 0) & (y < 8) & (z == 2)
cube3 = (x > 1) & (x < 7) & (y > 1) & (y < 7) & (z == 3)
cube4 = (x > 2) & (x < 6) & (y > 2) & (y < 6) & (z == 4)
cube5 = (x > 3) & (x < 5) & (y > 3) & (y < 5) & (z == 5) cube = cube1 | cube2 | cube3 | cube4 | cube5 fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
fig.set_size_inches(8, 6)
ax.voxels(cube, color="goldenrod", edgecolor="g") plt.show()

4. 总结

看了matplotlib的3D绘图功能,尤其是曲面图绘制方面,
我觉得它的3D功能不仅仅是给分析图表拓展了一个维度这么简单,而是让它在数学上的表现能力也极大提高了。

配合numpy中的数学函数,3D绘图能够展示很多复杂的几何曲面,让matplotlib的使用范围大大拓展。

【matplotlib基础】--3D图形的更多相关文章

  1. Python 使用 matplotlib绘制3D图形

    3D图形在数据分析.数据建模.图形和图像处理等领域中都有着广泛的应用,下面将给大家介绍一下如何在Python中使用 matplotlib进行3D图形的绘制,包括3D散点.3D表面.3D轮廓.3D直线( ...

  2. Python画各种 3D 图形Matplotlib库

    回顾 2D 作图 用赛贝尔曲线作 2d 图.此图是用基于 Matplotlib 的 Path 通过赛贝尔曲线实现的,有对赛贝尔曲线感兴趣的朋友们可以去学习学习,在 matplotlib 中,figur ...

  3. 现代3D图形编程学习-基础简介(3)-什么是opengl (译)

    本书系列 现代3D图形编程学习 OpenGL是什么 在我们编写openGL程序之前,我们首先需要知道什么是OpenGL. 将OpenGL作为一个API OpenGL 通常被认为是应用程序接口(API) ...

  4. 现代3D图形编程学习-基础简介(2) (译)

    本书系列 现代3D图形编程学习 基础简介(2) 图形和渲染 接下去的内容对渲染的过程进行粗略介绍.遇到的部分内容不是很明白也没有关系,在接下去的章节中,会被具体阐述. 你在电脑屏幕上看到的任何东西,包 ...

  5. 现代3D图形编程学习-基础简介(1) (译)

    本书系列 现代3D图形编程学习 基础简介 并不像本书的其他章节,这章内容没有相关的源代码或是项目.本章,我们将讨论向量,图形渲染理论,以及OpenGL. 向量 在阅读这本书的时候,你需要熟悉代数和几何 ...

  6. Matplotlib基础图形之散点图

    Matplotlib基础图形之散点图 散点图特点: 1.散点图显示两组数据的值,每个点的坐标位置由变量的值决定 2.由一组不连续的点组成,用于观察两种变量的相关性(正相关,负相关,不相关) 3.例如: ...

  7. 现代3D图形编程学习-环境设置

    本书系列 现代3D图形编程学习 环境设置 由于本书中的例子,均是基于OpenGL实现的,因此你的工作环境需要能够运行OpenGL,为了读者能够更好的运行原文中的示例,此处简单地介绍了linux和win ...

  8. 现代3D图形编程学习-关于本书(译)

    本书系列 现代3D图形编程学习 关于这本书 三维图像处理硬件很快成为了必不可少的组件.很多操作系统能够直接使用三维图像硬件,有些甚至要求需要有3D渲染能力的硬件.同时对于日益增加的手机系统,3D图像硬 ...

  9. 3D图形图像处理软件HOOPS介绍及下载

    HOOPS 3D Application Framework(以下简称HOOPS)是建立在OpenGL.Direct3D等图形编程接口之上的更高级别的应用程序框架.不仅为您提供强大的图形功能,还内嵌了 ...

  10. WHY翻写NEHE与红龙的3D图形程序 [开源]

    个人认为学习3D图形程序开发,有两套经典教程.D3D的<D3D游戏开发编程基础>也就是红龙那本书.OpenGL的NEHE教程.为向经典致敬,将我之前翻写他们的程序开源. 我所做的工作是将其 ...

随机推荐

  1. JVM源码分析:深入剖析java.c文件中JavaMain方法中InitializeJVM的实现

    经过前文<从JDK源码级深入剖析main方法的运行机制>的分析,我们知道了实现JavaMain方法的四个主要步骤: 初始化Java虚拟机 加载主运行类 通过加载的主运行类,获取main方法 ...

  2. 轻松掌握Python+主流测试框架Requests接口自动化,快速转型自动化测试

    轻松掌握Python+主流测试框架Requests接口自动化,快速转型自动化测试 最近几年,自动化测试已经成为了软件测试的主流趋势,而Python语言和Requests库作为主流测试框架,也成为了越来 ...

  3. 4. SpringMVC获取请求参数

    1. 通过 ServletAPI 获取 ‍ 将 HttpServletRequest 作为控制器方法的形参 , 此时 HttpServletRequest 类型的参数表示封装了当前请求的请求报文的对象 ...

  4. 解决Springboot项目打成jar包后获取resources目录下的文件失败的问题

    前几天在项目读取resources目录下的文件时碰到一个小坑,明明在本地是可以正常运行的,但是一发到测试环境就报错了,说找不到文件,报错信息是:class path resource [xxxx] c ...

  5. Sentieon | 每周文献-Tumor Sequencing-第三期

    肿瘤测序系列文章-1 标题(英文):The relationship between genetic characteristics and clinical characteristics and ...

  6. Sentieon安装时 jemalloc error 解决办法

    背景 Sentieon建议使用jemalloc来改善Sentieon应用程序中的内存管理和整体性能,尤其是Sentieon bwa-mem.有时在安装运行过程中会出现报错: ERROR: ld.so: ...

  7. java开发的配置文件配置到数据库(配置到配置文件里面个人感觉修改较麻烦,故配置到数据库)

    配置文件的创建表sql CREATE TABLE `checkwork_tab_properties` ( `id` varchar(50) NOT NULL COMMENT '主键id', `typ ...

  8. (四) MdbCluster分布式内存数据库——业务消息处理

    (四) MdbCluster分布式内存数据库--业务消息处理   上篇:(三) MdbCluster分布式内存数据库--节点状态变化及分片调整   离上次更新文章已有快5个月,我还是有点懒.但我们系统 ...

  9. python(django启动报错,之编码问题)UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 0: invalid start byte

  10. PerfView 洞察C#托管堆内存 "黑洞现象"

    一:背景 1. 讲故事 首先声明的是这个 黑洞 是我定义的术语,它是用来表示 内存吞噬 的一种现象,何为 内存吞噬,我们来看一张图. 从上面的 卦象图 来看,GCHeap 的 Allocated=85 ...