python使用的便利是因为它强大的兼容能力,简简单单的import使用的模块就可以方便使用了。其中一个重要的画图模块就是matplotlib 模块,想必大家对matplotlib模块都有一定的了解,今天我想来记录一下利用matplotlib画3D效果图。由于本博客有gif动态图可能耗费一定 流量,请大家谨慎查看。

今天是2月15号,也是中国的除夕,明天就是大年初一,也就是新年了,在这里祝福大家新的一年万事如意!为了欢度新年我把博客背景换成 了大红色,自己感觉很喜气。好了,我们来开始今天的学术讨论。

matplotlib是一个在Python下的2d绘图库,尽管它的起源是仿MATLAB的图形命令,但是与MATLAB不相关,并且是以对象对象方式,运行于 Python环境下。尽管mapplotlib主要都是用纯Python写的,但是为了在运行时有更高的性能,特别是在显示大量数组数据的情况下,里面 也大量使用了NumPy和其他的扩展代码。

准备模块

首先在进行 3D Plot 时除了导入 matplotlib ,还要额外添加一个模块,即 Axes 3D 3D 坐标轴显示 :

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

之后要先定义一个图像窗口,在窗口上添加3D坐标轴

fig = plt.figure()
ax = Axes3D(fig)

显示成下图:

绘制3D图

接下来给进 X 和 Y 值,并将 X 和 Y 编织成栅格。每一个(X, Y)点对应的高度值我们用下面这个函数来计算。

# X, Y value
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X ** 2 + Y ** 2)
# height value
Z = np.sin(R)

有了上述定义我们就可以直接打印出图片了:

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))

做出一个三维曲面,并将一个 colormap rainbow 填充颜色,之后将三维图像投影到 XY 平面上做一个等高线图。 plot 3D 图像:

其中,rstridecstride 分别代表 row 和 column 的跨度。

我们看看这个输出ax.plot_surface的描述:

"""
============= ================================================
        Argument      Description
        ============= ================================================
        *X*, *Y*, *Z* Data values as 2D arrays
        *rstride*     Array row stride (step size), defaults to 10
        *cstride*     Array column stride (step size), defaults to 10
        *color*       Color of the surface patches
        *cmap*        A colormap for the surface patches.
        *facecolors*  Face colors for the individual patches
        *norm*        An instance of Normalize to map values to colors
        *vmin*        Minimum value to map
        *vmax*        Maximum value to map
        *shade*       Whether to shade the facecolors
        ============= ================================================
"""

3D投影

添加 XY 平面的等高线:

ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.get_cmap('rainbow'))

如果 zdir 选择了x,那么效果将会是对于 XZ 平面的投影,效果如下:

我们看看这个输出ax.contourf的描述:

"""
==========  ================================================
        Argument    Description
        ==========  ================================================
        *X*, *Y*,   Data values as numpy.arrays
        *Z*
        *zdir*      The direction to use: x, y or z (default)
        *offset*    If specified plot a projection of the filled contour
                    on this position in plane normal to zdir
        ==========  ================================================
"""

最后要说的是python打印的3D效果图可以旋转查看,这里放一张动态图:

谢谢观看,希望对您有所帮助,欢迎指正错误,欢迎一起讨论!!!