没脚的雀

Matplotlib的3d绘画

matplotlib中绘画3d图案的工具——mplot3d

python的matplotlib画图库主要定位是绘画2d的图案,而绘画3d图案只是它的附加功能,所以其处在matplotlib的mpl_toolkits 子库中。主要为用户提供在3d空间中绘画散点图、线图、曲面图等简单图案的能力。

简单文档

getting started

在matplotlib中每一个图片由figure, axes构成,在mpl_toolkits.mplot3d 中专门为绘画3d图案提供了一个Axes3D类,通过下面的语句进行引用

1
2
3
4
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")

绘画线段

调用Axes3D实例的plot方法,参数如下

参数 说明
xs, ys 分别传入x轴、y轴的坐标
zs 传入对应与xs、ys的zs值
zdir [‘x’, ‘y’, ‘z’] ,绘画2d图案时,指定值为常数的轴
1
2
z = np.arange(0, 20, 0.05)
ax.plot(np.cos(z), np.sin(z), z)

欧拉曲线

散点图

调用Axes3D实例的scatter方法, 参数如下:

参数 说明
xs, ys 同上
zs 同上
zdir 同上
s 设置每一个散点的大小, 该参数要么是一个标量,要么是一个与xs相同长度的向量
c 设置每个点的颜色。c可以是一个代表颜色的字符 , 或者是一个与xs长度相同的代表颜色的字符数组

线框绘制

调用Axes3D实例的plot_wireframe(X, Y, Z, *args, **kwargs)

参数 说明
X、Y 二维的数据
Z
rstride 行抽样间隔, 默认是1
cstride 列抽样间隔, 默认是1
rcount 使用的行样本的最大值, 默认为50
ccount 使用列样本的最大值, 默认为50
1
2
3
4
5
from mpl_toolkits.mplot3d import axes3d
X, Y, Z = axes3d.get_test_data(0.05)

# Plot a basic wireframe.
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)

线框

曲面绘制

曲面的绘制有点像在线框图中的每一个方格填充颜色,matplotlib中的曲面是由一块块的小的表面构成。

调用Axes3D实例的plot_surface(X, Y, Z, *args, **kwargs)

参数 说明
X, Y, Z 二维的数据
rstride, cstride, rcount, ccount 同wire_frame
color 曲面每一个小块的颜色
cmap
facecolors
norm
1
2
from matplotlib import cm
ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, rstride=5, cstride=5)

等高线绘制

调用Axes3D实例的contour(X, Y, Z, *args, **kwargs)

参数 说明
X, Y numpy.array的实例
Z
extend3d 默认为False
stride 抽样间隔
zdir 默认是’z’
offset 将等高线投影在指定的 zdir平面的 offset 位置
1
2
3
4
5
ax.plot_surface(X, Y, Z, alpha=0.3)
ax.contour(X, Y, Z, cmap=cm.coolwarm)
ax.contour(X, Y, Z, offset=-60, cmap=cm.coolwarm)
ax.contour(X, Y, Z, offset=-35, zdir="x", cmap=cm.coolwarm)
ax.contour(X, Y, Z, offset=35, zdir="y", cmap=cm.coolwarm)

等高线

与3d绘画有关的几个函数

  • np.mgrid[x_start : x_stop : x_step, y_start: y_stop: y_step], 该函数用于生成平面坐标的X,Y

  • np.dstack((X, Y)), 将分离的X轴坐标和Y轴坐标组合成X_Y 平面坐标

    1
    2
    3
    X,  Y = np.mgrid[0:2:1, 0:3:1]
    pos = np.dstack((X, Y))
    z = some_func(pos)

  • 比如说画一个二维正态分布的概率密度函数图

1
2
3
4
Xx, Yy = np.mgrid[-3:3:0.05, -3:3:0.05]
pos = np.dstack((Xx, Yy))
Zz = scipy.stats.multivariate_normal.pdf(pos, mean=[0, 0])
ax.plot_surface(Xx, Yy, Zz)

二维正态概率密度

大佬给口饭吃咧