Matplotlib基础-3D图形

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

后来的版本中,matplotlib加入了3D图形 的支持,不仅仅是为了使数据的展示更加生动和有趣。

更重要的是,由于多了一个维度,扩展了其展示数据分布和关系的能力,可以一次从三个维度来比较数据。

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

1. 点和线

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

比如:

python 复制代码
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图形:

python 复制代码
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. 面

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

比如,对于曲面函数: <math xmlns="http://www.w3.org/1998/Math/MathML"> z = x ∗ y 3 − y ∗ x 3 z = x*y^3 - y*x^3 </math>z=x∗y3−y∗x3

绘制时,不能像如下这样:

python 复制代码
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函数先生成网格。

python 复制代码
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曲面了。

python 复制代码
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.plot_surface(xs, ys, zs)

plt.show()

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

python 复制代码
ax.plot_wireframe(xs, ys, zs)

从这个示例可以看出,3D曲面 其实是一个个网格拼接而成的,

并没有想象中的平滑,它的平滑程度取决于网格的大小和密度。

3. 立方体

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

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

python 复制代码
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的使用范围大大拓展。

相关推荐
RestCloud6 小时前
数据传输中的三大难题,ETL 平台是如何解决的?
数据分析·api
源猿人2 天前
企业级文件浏览系统的Vue实现:架构设计与最佳实践
前端·javascript·数据可视化
IT毕设梦工厂3 天前
大数据毕业设计选题推荐-基于大数据的客户购物订单数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
大数据·hadoop·数据分析·spark·毕业设计·源码·bigdata
大数据CLUB3 天前
基于spark的澳洲光伏发电站选址预测
大数据·hadoop·分布式·数据分析·spark·数据开发
智数研析社3 天前
9120 部 TMDb 高分电影数据集 | 7 列全维度指标 (评分 / 热度 / 剧情)+API 权威源 | 电影趋势分析 / 推荐系统 / NLP 建模用
大数据·人工智能·python·深度学习·数据分析·数据集·数据清洗
qingyunliushuiyu3 天前
BI数据可视化:驱动数据价值释放的关键引擎
数据挖掘·数据分析·数据分析系统·数据分析平台·bi数据可视化
CodeCraft Studio3 天前
【案例分享】TeeChart 助力 Softdrill 提升油气钻井数据可视化能力
信息可视化·数据可视化·teechart·油气钻井·石油勘探数据·测井数据
折翼的恶魔3 天前
数据分析:排序
python·数据分析·pandas
lssjzmn3 天前
基于Spring Boot与Micrometer的系统参数监控指南
java·spring boot·数据可视化
数据牧羊人的成长笔记3 天前
数据分析需要掌握的数学知识(易理解)
数学建模·数据分析