введение
Сегодня вечером я начал связываться с функцией 3D-рисования Matplotlib plot_surface.Она действительно мощная.Качество изображения может достигать уровня публикации,и 3D-изображение можно вращать,и 3D-стереограмму можно рассматривать под разными углами.Однако я обнаружил, что основные китайские сообщества с открытым исходным кодом связаны с 3D Код для рисования тот же За исключением описания исходного кода, я едва могу получить описание какого-либо важного параметра plot_surface, и я чувствую, что описание исходного кода на чистом английском языке неясно и сложно понять, и нет сопроводительной картинки, новички видят это как В тумане, после ночи отладки полностью понял смысл всех параметров, и как менять эти параметры для управления отображением графики.Сейчас буду поделитесь небольшим опытом.
Talk is cheap, show the code
# -*- coding: utf-8 -*-
# author: inspurer(月小水长)
# pc_type lenovo
# create_date: 2019/1/23
# 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(-4, 4, 0.25)
y = np.arange(-4, 4, 0.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(-2, 2)
plt.show()
Результаты приведены ниже:
Я уже прокомментировал большинство параметров, что должно быть легко понять.Параметры rstride (шаг строки) и cstride (шаг столбца) (шаг означает размер шага, строка: строка, столбец: столбец) являются предварительными. фокусируется на том, как их понимать.
Предварительная разведка
Поворот 3D-графики,
Я обнаружил, что количество полос равно 32 как в направлении x, так и в направлении y.
А это оказывается мы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 (строка) соответствует направлению x, c (столбец) соответствует направлению y, rstride = 1 указывает, что интервал полосы в направлении x равен 1 x единице длины (т. е. 0,25), а cstride = 1 указывает интервал полос в направлении y равен 1 x единице длины (также 0,25). и положиrstride = 1, cstride = 1
После его удаления я обнаружил, что график не меняется, указывая на то, что 1 расстояние является значением по умолчанию. И эти два параметра могут быть только положительными целыми числами, а наименьшее положительное целое число равно 1 (значение по умолчанию), поэтому в принципе нам не нужно изменять этот параметр для плавности графика.
проверять
Измените параметры так, чтобы rstride = 4
Результат выглядит следующим образом:
32 / 4 = 8, количество полос в направлении x становится равным 8, что соответствует нашим ожиданиям, кажется, мы должны правильно рассуждать.
Измените параметры так, чтобы и rstride, и cstride = 4.
Результат выглядит следующим образом:
Видно, что количество полос стало равно 8 как по оси X, так и по оси Y. В то же время из-за большего интервала графика стала более грубой, чем раньше.
Это еще раз подтверждает наши предположения!