Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9e92ed9

Browse files
3d plot view angle documentation
1 parent 9b1fcf6 commit 9e92ed9

File tree

4 files changed

+104
-2
lines changed

4 files changed

+104
-2
lines changed

doc/_static/mplot3d_view_angles.png

24.4 KB
Loading

doc/api/toolkits/mplot3d.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ more information.
2020

2121
The interactive backends also provide the ability to rotate and zoom the 3D
2222
scene. One can rotate the 3D scene by simply clicking-and-dragging the scene.
23-
Zooming is done by right-clicking the scene and dragging the mouse up and down
24-
(unlike 2D plots, the toolbar zoom button is not used).
23+
Panning is done by clicking the middle mouse button, and zooming is done by
24+
right-clicking the scene and dragging the mouse up and down. Unlike 2D plots,
25+
the toolbar pan and zoom buttons are not used.
2526

2627
.. toctree::
2728
:maxdepth: 2
2829

2930
mplot3d/faq.rst
31+
mplot3d/view_angles.rst
3032

3133
.. note::
3234
`.pyplot` cannot be used to add content to 3D plots, because its function
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
.. _toolkit_mplot3d-view-angles:
2+
3+
*******************
4+
mplot3d View Angles
5+
*******************
6+
7+
How to define the view angle
8+
============================
9+
10+
The position of the viewport "camera" in a 3D plot is defined by three angles:
11+
elevation, azimuth, and roll. From the resulting position, it always points
12+
towards the center of the plot box volume. The angle direction convention is
13+
shared with
14+
`PyVista <https://docs.pyvista.org/api/core/camera.html>`_ and
15+
`MATLAB <https://www.mathworks.com/help/matlab/ref/view.html>`_
16+
(though MATLAB lacks a roll angle). Note that a positive roll angle rotates the
17+
viewing plane clockwise, so the 3d axes will appear to rotate
18+
counter-clockwise.
19+
20+
.. image:: /_static/mplot3d_view_angles.png
21+
:align: center
22+
:scale: 50
23+
24+
Rotating the plot using the mouse will control only the azimuth and elevation,
25+
but all three angles can be set programmatically::
26+
27+
import matplotlib.pyplot as plt
28+
ax = plt.figure().add_subplot(projection='3d')
29+
ax.view_init(elev=30, azim=45, roll=15)
30+
31+
32+
Primary view planes
33+
===================
34+
35+
To look directly at the primary view planes, the required elevation, azimuth,
36+
and roll angles are shown in the diagram of an "unfolded" plot below. These are
37+
further documented in the `.mplot3d.axes3d.Axes3D.view_init` API.
38+
39+
.. figure:: ../../gallery/mplot3d/images/sphx_glr_view_planes_3d_001.png
40+
:target: ../../gallery/mplot3d/view_planes_3d.html
41+
:align: center

examples/mplot3d/view_planes_3d.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"""
2+
===================
3+
Primary View Planes
4+
===================
5+
6+
This example generates an "unfolded" 3D plot that shows each of the primary 3D
7+
view planes. The elevation, azimuth, and roll angles required for each view are
8+
labeled. You could print out this image and fold it into a box where each plane
9+
forms a side of the box.
10+
"""
11+
12+
import matplotlib.pyplot as plt
13+
14+
def annotate_axes(ax, text, fontsize=18):
15+
ax.text(x=0.5, y=0.5, z=0.5, s=text,
16+
va="center", ha="center", fontsize=fontsize, color="black")
17+
18+
# (view, (elev, azim, roll))
19+
views = [( 'XY', ( 90, -90, 0)),
20+
( 'XZ', ( 0, -90, 0)),
21+
( 'YZ', ( 0, 0, 0)),
22+
('-XY', (-90, 90, 0)),
23+
('-XZ', ( 0, 90, 0)),
24+
('-YZ', ( 0, 180, 0))]
25+
26+
layout = [['XY', '.', 'L', '.'],
27+
['XZ','YZ','-XZ','-YZ',],
28+
['.', '.','-XY', '.',]]
29+
fig, axd = plt.subplot_mosaic(layout, subplot_kw={'projection': '3d'},
30+
figsize=(12, 8.5))
31+
for i in range(len(axd) - 1):
32+
plane = views[i][0]
33+
axd[plane].set_xlabel('x')
34+
axd[plane].set_ylabel('y')
35+
axd[plane].set_zlabel('z')
36+
axd[plane].set_proj_type('ortho')
37+
axd[plane].view_init(elev=views[i][1][0],
38+
azim=views[i][1][1],
39+
roll=views[i][1][2])
40+
axd[plane].set_box_aspect(None, zoom=1.25)
41+
42+
label = f'{plane}\n{views[i][1]}'
43+
annotate_axes(axd[plane], label, fontsize=14)
44+
45+
for plane in ('XY', '-XY'):
46+
axd[plane].set_zticklabels([])
47+
axd[plane].set_zlabel('')
48+
for plane in ('XZ', '-XZ'):
49+
axd[plane].set_yticklabels([])
50+
axd[plane].set_ylabel('')
51+
for plane in ('YZ', '-YZ'):
52+
axd[plane].set_xticklabels([])
53+
axd[plane].set_xlabel('')
54+
55+
label = ('mplot3d primary view planes\nax.view_init(elev, azim, roll)')
56+
annotate_axes(axd['L'], label, fontsize=18)
57+
axd['L'].set_axis_off()
58+
59+
plt.show()

0 commit comments

Comments
 (0)