翼度科技»论坛 编程开发 python 查看内容

【matplotlib基础】--3D图形

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
matplotlib 在1.0版本之前其实是不支持3D图形绘制的。
后来的版本中,matplotlib加入了3D图形的支持,不仅仅是为了使数据的展示更加生动和有趣。
更重要的是,由于多了一个维度,扩展了其展示数据分布和关系的能力,可以一次从三个维度来比较数据。
下面介绍在matplotlib中绘制各类3D图形的方法。
1. 点和线

点和线类的图形转成3D比较简单,只要加个维度即可。
比如:
  1. import numpy as np
  2. import matplotlib
  3. import matplotlib.pyplot as plt
  4. n = 10
  5. xs = np.linspace(0, 100, n)
  6. ys = np.linspace(100, 200, n)
  7. fig, ax = plt.subplots()
  8. ax.scatter(xs, ys, color="r")
  9. ax.plot(xs, ys)
  10. plt.show()
复制代码

增加一个维度,改成3D图形:
  1. n = 10
  2. xs = np.linspace(0, 100, n)
  3. ys = np.linspace(100, 200, n)
  4. zs = xs + ys  #增加一个维度,值为x+y的和
  5. fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
  6. ax.scatter(xs, ys, zs, color='r')
  7. ax.plot(xs, ys, zs)
  8. plt.show()
复制代码

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

绘制面或者曲面的时候稍微复杂一些,不像点和面只要简单的增加一个维度就可以了。
比如,对于曲面函数:\(z = x*y^3 - y*x^3\)
绘制时,不能像如下这样:
  1. xs = np.arange(-10, 10, 0.5)
  2. ys = np.arange(-10, 10, 0.5)
  3. zs = xs * (ys**3) - ys * (xs**3)
复制代码
这样得到的xs, ys, zs只是3维中的一个个点的(x, y, z)坐标,无法绘制曲面。
只能像上一节那样绘制3维中的或者线
若要绘制曲面,需要用到numpy提供的meshgrid函数先生成网格。
  1. xs = np.arange(-10, 10, 0.5)
  2. ys = np.arange(-10, 10, 0.5)
  3. xs, ys = np.meshgrid(xs, ys)  #生成网格坐标
  4. zs = xs * (ys**3) - ys * (xs**3)  #计算网格中每个点的Z轴坐标
复制代码
这样,把坐标传入plot_surface函数,就可以绘制最后的3D曲面了。
  1. fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
  2. ax.plot_surface(xs, ys, zs)
  3. plt.show()
复制代码

只显示网格的话,可以用 plot_wireframe 函数。
  1. ax.plot_wireframe(xs, ys, zs)
复制代码

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

matplotlib中提供了一个绘制立方体的函数voxels,通过这个函数可以很方便的绘制各种立方体形状。
我用voxels绘制了一个简易的金字塔结构:
  1. x, y, z = np.indices((10, 10, 8))
  2. cube1 = (x < 9) & (y < 9) & (z == 1)
  3. cube2 = (x > 0) & (x < 8) & (y > 0) & (y < 8) & (z == 2)
  4. cube3 = (x > 1) & (x < 7) & (y > 1) & (y < 7) & (z == 3)
  5. cube4 = (x > 2) & (x < 6) & (y > 2) & (y < 6) & (z == 4)
  6. cube5 = (x > 3) & (x < 5) & (y > 3) & (y < 5) & (z == 5)
  7. cube = cube1 | cube2 | cube3 | cube4 | cube5
  8. fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
  9. fig.set_size_inches(8, 6)
  10. ax.voxels(cube, color="goldenrod", edgecolor="g")
  11. plt.show()
复制代码

4. 总结

看了matplotlib的3D绘图功能,尤其是曲面图绘制方面,
我觉得它的3D功能不仅仅是给分析图表拓展了一个维度这么简单,而是让它在数学上的表现能力也极大提高了。
配合numpy中的数学函数,3D绘图能够展示很多复杂的几何曲面,让matplotlib的使用范围大大拓展。

来源:https://www.cnblogs.com/wang_yb/p/17723952.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具