深刻理解 Matplotlib3D 绘图函数 plot_surface

 引言python


今晚开始接触 Matplotlib 的 3D 绘图函数 plot_surface,真的很是强大,图片质量能够达到出版级别,并且 3D 图像能够旋转 ,能够从不一样角度来看某个 3D 立体图,可是我发现各大中文开源社区有关 3D 绘图的代码都是千篇一概的,现除了看源码说明,我几乎得不到半点有关 plot_surface 的重要参数说明,并且我感受纯英文的源码说明晦涩难懂,并且没有任何配图,初学者看得是云里雾里,通过一夜的调试,我才彻底弄明白全部参数的含义,以及如何改变这些参数控制图形的显示,现将一点心得分享出来git


Talk is cheap, show the codegithub


# -*- coding: utf-8 -*-
# author:           inspurer(月小水长)
# pc_type           lenovo
# create_date:      2019/5/25
# file_name:        3DTest
# github            https://github.com/inspurer
# 微信公众号         月小水长(ID: inspurer)

"""
绘制3d图形
"""


import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
# 定义figure
fig = plt.figure()
# 建立3d图形的两种方式
# 将figure变为3d
ax = Axes3D(fig)

#ax = fig.add_subplot(111, projection='3d')

# 定义x, y
x = np.arange(-440.25)
y = np.arange(-440.25)

# 生成网格数据
X, Y = np.meshgrid(x, y)

# 计算每一个点对的长度
R = np.sqrt(X ** 2 + Y ** 2)
# 计算Z轴的高度
Z = np.sin(R)

# 绘制3D曲面


# rstride:行之间的跨度  cstride:列之间的跨度
# rcount:设置间隔个数,默认50个,ccount:列的间隔个数  不能与上面两个参数同时出现


# cmap是颜色映射表
# from matplotlib import cm
# ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap = cm.coolwarm)
# cmap = "rainbow" 亦可
# 个人理解的 改变cmap参数能够控制三维曲面的颜色组合, 通常咱们见到的三维曲面就是 rainbow 的
# 你也能够修改 rainbow 为 coolwarm, 验证个人结论
ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap = plt.get_cmap('rainbow'))

# 绘制从3D曲面到底部的投影,zdir 可选 'z'|'x'|'y'| 分别表示投影到z,x,y平面
# zdir = 'z', offset = -2 表示投影到z = -2上
ax.contour(X, Y, Z, zdir = 'z', offset = -2, cmap = plt.get_cmap('rainbow'))

# 设置z轴的维度,x,y相似
ax.set_zlim(-22)

plt.show()


运行结果以下:微信


1

其中大部分的参数说明我已经在注释了,应该很容易理解,其中的 rstride (row stride)和 cstride (column stride) (stride是步长的意思,row : 行,column : 列)参数也有了初步的介绍,下面重点讨论如何理解他们。app


初探ide

旋转 3D 图形函数



2

我发现不管是 x 向,仍是 y 向,条纹数都是 32
而这恰好是咱们 x = np.arange(-4, 4, 0.25)中[4-(-4)]/0.25 = 32
ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap = plt.get_cmap('rainbow'))中 rstride = 1, cstride = 1,r(row)对应 x向,c(column)对应 y 向,rstride = 1 说明在 x 向的条纹间隔为 1 个 x 向单位长度(也就是 0.25),cstride = 1 说明在y向的条纹间隔为 1 个 x 向单位长度(也是 0.25)。而把rstride = 1, cstride = 1去掉以后,我发现图形不变,说明 1 个距离是默认值。并且这两个参数只能是正整数,最小正整数就是 1(默认值),因此为了图形的平滑,基本上咱们不须要修改这个参数。spa


验证.net


修改参数,使 rstride = 4

其结果以下:3d


3

32 / 4 = 8,x向的条纹数变成了 8 ,这符合咱们的预期,看来咱们得推测是正确的。

修改参数,同时使 rstride 和 cstride  = 4

其结果以下:


4

能够看到不管是 x 向,仍是 y 向,条纹数都变成了 8 ,同时因为间距变大,图形也比原来更粗糙了。


这再一次验证了咱们的推测是正确的!


往期精选


历年高考录取分数线查询


Matplotlib 实战:写一个任意函数极值可视化脚手架





本文分享自微信公众号 - 月小水长(inspurer)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。