利用matplotlib打印3D图片
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 图像:
其中,rstride
和 cstride
分别代表 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效果图可以旋转查看,这里放一张动态图:
谢谢观看,希望对您有所帮助,欢迎指正错误,欢迎一起讨论!!!