Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: axes3d.py's _on_move() converts the roll angle to radians, but then passes it to view_init() as if it were still in degrees #28256

Closed
MischaMegens2 opened this issue May 17, 2024 · 0 comments · Fixed by #28261
Milestone

Comments

@MischaMegens2
Copy link
Contributor

Bug summary

In \lib\mpl_toolkits\mplot3d\axes3d.py, _on_move() deals with rotation of 3d axes using the mouse. In line 1522, the roll angle (in degrees) is converted to radians:
roll = np.deg2rad(self.roll)
This roll in radians is used to calculate a new elevation and azimuth, like so:

    delev = -(dy/h)*180*np.cos(roll) + (dx/w)*180*np.sin(roll)
    dazim = -(dy/h)*180*np.sin(roll) - (dx/w)*180*np.cos(roll)
    elev = self.elev + delev
    azim = self.azim + dazim

A moment later, the view is updated:

    self.view_init(
        elev=elev,
        azim=azim,
        roll=roll,
        vertical_axis=vertical_axis,
        share=True,
    )

However, view_init() expects its parameters to be in degrees, not radians. As a consequence, the roll now diminishes by a factor pi/180 with every mouse movement. Not intended.

Code for reproduction

# Run the surface3d.py example, adding
ax.roll = 45
# It shows the plot, in the intended funny orientation (roll=45)
# Then move the mouse - you will see the orientation jump suddenly (to roll=0)

Actual outcome

The figure orientation has jumped to roll=0, after trying to rotate it only slightly by dragging the mouse:
Figure_rotated

Expected outcome

The figure is close to its original orientation (before dragging the mouse), at roll=45:
Figure_1

Additional information

Fix: add a line:
roll = self.roll
right after updating elev and azim (i.e., after line 1526).

Operating system

All, presumably; but I noticed it on Windows

Matplotlib Version

3.10.0.dev191+ge5af947d1b.d20240517

Matplotlib Backend

tkagg

Python version

Python 3.12.3

Jupyter version

No response

Installation

pip

@QuLogic QuLogic added this to the v3.9.1 milestone May 17, 2024
MischaMegens2 added a commit to MischaMegens2/matplotlib that referenced this issue May 19, 2024
Pass roll angle to view_init() in degrees (not radians)
MischaMegens2 added a commit to MischaMegens2/matplotlib that referenced this issue May 22, 2024
Add tests for roll (test_axes3d_roll), for rotation using the mouse (test_rotate), and for rotation using the mouse when roll is nonzero (test_rotate_roll). The latter fails if the roll angle is passed with wrong units (issue matplotlib#28256).
MischaMegens2 added a commit to MischaMegens2/matplotlib that referenced this issue May 22, 2024
Add tests for rotation using the mouse (test_rotate), with and without roll. The test with nonzero roll fails if the roll angle is passed with wrong units (issue matplotlib#28256).
oscargus added a commit that referenced this issue May 24, 2024
meeseeksmachine pushed a commit to meeseeksmachine/matplotlib that referenced this issue May 24, 2024
timhoffm added a commit that referenced this issue May 25, 2024
…261-on-v3.9.x

Backport PR #28261 on branch v3.9.x (Correct roll angle units, issue #28256)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants