Углы обзора mplot3d
Как задать угол обзора
Положение «камеры» области просмотра на 3D-графике задаётся тремя углами: углом места, азимутом и креном. Из полученного положения камера всегда направлена на центр объёма области построения. Направление отсчёта углов является общепринятым и используется также в PyVista и MATLAB. Обратите внимание: положительный угол крена поворачивает плоскость обзора по часовой стрелке, поэтому оси 3D-графика будут казаться повёрнутыми против часовой стрелки.
Вращение графика с помощью мыши управляет азимутом, углом места и креном; все три угла можно задать программно:
import matplotlib.pyplot as plt ax = plt.figure().add_subplot(projection='3d') ax.view_init(elev=30, azim=45, roll=15)
Основные плоскости обзора
На схеме ниже показан «развёрнутый» график и необходимые значения угла места, азимута и крена для прямого обзора основных плоскостей. Дополнительные сведения приведены в документации API mplot3d.axes3d.Axes3D.view_init.
(Source code, 2x.png, png)
Вращение мышью
Ориентацию 3D-графиков можно менять, перетаскивая мышь. Это можно делать разными способами; стиль вращения мышью задаётся параметром rcParams["axes3d.mouserotationstyle"] (по умолчанию: 'arcball'); см. раздел Настройка Matplotlib с помощью таблиц стилей и rcParams.
До версии v3.10 положение указателя мыши в 2D напрямую соответствовало азимуту и углу места; такой же подход используется в MATLAB. Чтобы сохранить это поведение, задайте mouserotationstyle: azel. Такой подход хорошо подходит для графиков в сферических координатах, где ось z является особой; однако при взгляде вдоль оси z возникает своего рода «блокировка карданова подвеса»: график по-разному реагирует на движения мыши в зависимости от текущей ориентации. Кроме того, управлять «креном» таким способом нельзя.
В качестве альтернативы можно использовать различные стили вращения мышью, при которых мышь управляет виртуальным «трекболом». В простейшем варианте (mouserotationstyle: trackball) трекбол вращается вокруг оси, лежащей в плоскости и перпендикулярной движению мыши (как если бы на трекбол была положена пластина: ориентация самой пластины не меняется, но её можно перетаскивать мышью, вращая шар). С этим стилем работать естественнее, чем со стилем azel; однако график нельзя легко повернуть вокруг направления обзора — для этого нужно двигать мышь по кругу в направлении, противоположном желаемому вращению, что не слишком интуитивно.
Другой вариант трекбола вращается по кратчайшей дуге виртуальной сферы (mouserotationstyle: sphere). Повернуть график вокруг направления обзора с его помощью просто: захватите шар ближе к краю, а не к центру.
Также доступен ARCBALL Кена Шумейка [Shoemake1992] (mouserotationstyle: Shoemake); он похож на стиль sphere, но не подвержен гистерезису: при возвращении мыши в исходное положение фигура возвращается к исходной ориентации. Вращение не зависит от особенностей траектории движения мыши, что может быть полезно. Однако arcball Шумейка вращается с угловой скоростью, вдвое превышающей скорость движения мыши (это особенно заметно при настройке крена), и у него нет очевидного механического аналога; можно утверждать, что вращение, не зависящее от траектории, не слишком естественно (хотя и удобно) и к нему может потребоваться привыкнуть. Таким образом, это компромисс.
Обзор можно найти в работе Хенриксена и соавторов [Henriksen2002]. Краткое описание:
Стиль | традиционный [1] | включая крен [2] | равномерный [3] | независимый от траектории [4] | механический аналог [5] |
azel | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
trackball | ❌ | ✓ [6] | ✔️ | ❌ | ✔️ |
sphere | ❌ | ✔️ | ✔️ | ❌ | ✔️ |
arcball | ❌ | ✔️ | ✔️ | ✔️ | ❌ |
Попробовать различные стили вращения мышью можно с помощью:
import matplotlib as mpl
mpl.rcParams['axes3d.mouserotationstyle'] = 'trackball' # 'azel', 'trackball', 'sphere', or 'arcball'
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
ax = plt.figure().add_subplot(projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
plt.show()
Также можно создать файл matplotlibrc со следующим содержимым:
axes3d.mouserotationstyle: trackball
(или указать любой другой стиль вместо trackball), а затем запустить любой из примеров построения 3D-графиков.
Размер виртуального трекбола, сферы или arcball можно настроить с помощью параметра rcParams["axes3d.trackballsize"] (по умолчанию: 0.667). Он определяет, насколько нужно переместить мышь, чтобы получить заданный угол поворота (при движении около центра), а также задаёт положение края сферы или arcball (расстояние от центра, то есть близость к краю графика). Размер указывается в единицах ограничивающего прямоугольника Axes; чтобы arcball занимал весь ограничивающий прямоугольник, задайте значение 1. Размер около 2/3, по-видимому, вполне подходит; это значение используется по умолчанию.
У обоих вариантов arcball (mouserotationstyle: sphere и mouserotationstyle: arcball) хорошо заметен край; сделать его менее резким можно, задав ширину границы rcParams["axes3d.trackballborder"] (по умолчанию: 0.2). Это отчасти напоминает arcball Гэвина Белла, изначально созданный для OpenGL [Bell1988] и используемый в Blender и Meshlab. Arcball Белла дополняет сферическую поверхность управления гиперболой; они плавно соединяются. Однако гипербола продолжается за пределы края графика. В стилях sphere и arcball библиотеки mplot3d граница продолжается до радиуса trackballsize/2 + trackballborder. За границей стиль работает как исходный: он управляет только креном. Ширина границы около 0.2, по-видимому, подходит; это значение используется по умолчанию. Чтобы получить исходный arcball Шумейка с резкой границей, задайте ширину границы 0. Для расширенной границы, похожей на arcball Белла, где переход от arcball к границе происходит под углом 45°, задайте ширину границы \(\sqrt 2 \approx 1.414\). Граница представляет собой круговую дугу, цилиндрически обёрнутую вокруг сферы arcball (как пончик) и плавно соединённую со сферой, подобно гиперболе Белла.
Кен Шумейк, «ARCBALL: пользовательский интерфейс для задания трёхмерного вращения с помощью мыши», в сборнике трудов Graphics Interface '92, 1992, с. 151–156, https://doi.org/10.20380/GI1992.18
Гэвин Белл, примеры, включённые в библиотеку GLUT (OpenGL Utility Toolkit), markkilgard/glut
Кнуд Хенриксен, Йон Спорринг, Каспер Хорнбек, «Виртуальные трекболы: новый взгляд», в журнале IEEE Transactions on Visualization and Computer Graphics, том 10, выпуск 2, март–апрель 2004, с. 206–216, https://doi.org/10.1109/TVCG.2004.1260772 [полный текст];
© 2012–2026 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
https://matplotlib.org/stable/api/toolkits/mplot3d/view_angles.html