gpt4 book ai didi

【matplotlib基础】--3D图形

转载 作者:我是一只小鸟 更新时间:2023-09-23 15:02:09 34 4
gpt4 key购买 nike

matplotlib 在 1.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()

                        
                      

image.png

增加一个维度,改成 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()

                        
                      

image.png

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

                        
                          ax.plot_wireframe(xs, ys, zs)

                        
                      

image.png

从这个示例可以看出, 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()

                        
                      

image.png

4. 总结

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

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

最后此篇关于【matplotlib基础】--3D图形的文章就讲到这里了,如果你想了解更多关于【matplotlib基础】--3D图形的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com