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()
增加一个维度,改成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()
注意,获取子图的时候,subplo服务器托管网t_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 0) & (x 0) & (y 1) & (x 1) & (y 2) & (x 2) & (y 3) & (x 3) & (y
4. 总结
看了matplotlib
的3D绘图功能,尤其是曲面图绘制方面,
我觉得它的3D功能不仅仅是给分析图表拓展了一个维度这么简单,而是让它在数学上的表现能力也极大提高了。
配合numpy
中的数学函数,3D绘图能够展示很多复杂的几何曲面,让matplotlib
的使用范围大大拓展。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
由于系统重装,运行项目,后台报node-sass@4.13.1 postinstall: node scripts/build.js 页面报 大概率node-sass有问题 1、卸载: npm uninstall node-sass 2、安装: npm ins…