如何在Matplotlib中使用Axes3D进行缩放

20

我正在使用matplotlib生成一个三维图。我希望能够在感兴趣的区域内进行缩放。目前,我可以平移但无法缩放。通过查看mplot3d API,我了解到can_pan():的用法。

Return True if this axes supports the pan/zoom button functionality.

3D axes objects do not use the pan/zoom button.

并且 can_zoom():

Return True if this axes supports the zoom box button functionality.

3D axes objects do not use the zoom box button.

我认为两者都返回False(我认为can_pan返回False是因为轴不能同时平移和缩放,但也许我没有正确阅读API)。是否有一种方法可以启用缩放?API表明它不使用按钮。是否有一些方法可以启用缩放或设置can_pan()can_zoom()以返回True

以下是代码片段:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

data = np.genfromtxt('data_file.txt')

fig1 = plt.figure()
ax1 = fig1.gca(projection='3d')
ax1.scatter(data[:,0],data[:,1],data[:,2], c='r', marker='.')
plt.show()

ax1.can_zoom()
>>> False

ax1.can_pan()
>>> False

我正在一台装有 Ubuntu 14.04 64位桌面版的机器上使用 Python 2.7,并且已从默认存储库中安装了 matplotlib(如果相关,我可以查看版本)。


抱歉有点讽刺,但请实现它 ;)。can_pancan_zoom返回true的原因是当前不存在这个功能。 - tacaswell
@tcaswell,你说的“实现它”是什么意思?我找不到一个设置来使can_zoom()或者can_pan()返回True。你是说要编写一个能实现这个功能的方法吗? - Steven C. Howell
我的意思是,Axes3D类目前尚未实现通过矩形缩放或平移的功能。如果您想在Axes3D中看到这些功能,请自行实现它们。 - tacaswell
4个回答

21

实际上,@tcaswell是正确的,这个功能不存在,所以它会返回false。你尝试过在绘图窗口上使用“缩放到矩形”按钮吗?那个完美地解决了问题。如果你还没有尝试过,请参考matplotlib说明文档中与交互式导航相关的内容。

  1. 点击平移/缩放按钮:

    按下鼠标右键缩放,将其拖动到新位置。x轴将按向右移动的比例进行缩放,并按向左移动的比例进行缩小。

  2. 点击“缩放到矩形”按钮:

    将鼠标放在坐标轴上的某个位置上,按下鼠标左键。保持按住鼠标并将其拖动到新位置,然后释放鼠标。


4
您的评论启发我尝试使用右键,实际上这确实可以将画面放大到图的中心。这已经足够了,非常感谢。我之前尝试过使用平移/缩放按钮和缩放矩形按钮,但两者都无法改变左右鼠标按钮的功能。左键旋转3D图,右键放大中心。虽然只能放大中心,但我可以想办法在数据周围绘制一个框,使其偏离中心以移动图的中心。 - Steven C. Howell
1
如果你想深入了解3D图形绘制,并且不介意在程序中添加另一个依赖项,那么你可能想尝试使用Mayavi而不是MPL。根据你的应用程序,但它对于3D渲染非常强大。http://docs.enthought.com/mayavi/mayavi/ - Adam Hughes

1

你可以通过控制轴的限制来代替缩放功能,例如:

RADIUS = 1.0  # Control this value.
ax1.set_xlim3d(-RADIUS / 2, RADIUS / 2)
ax1.set_zlim3d(-RADIUS / 2, RADIUS / 2)
ax1.set_ylim3d(-RADIUS / 2, RADIUS / 2)

如果您将RADIUS变量定义得更小,您可以更近距离地查看数据。在这个例子中,您可以从原点缩放进入和缩放出来。

您可以选择其他焦点,但需要计算适当的限制以实现所需的视图。希望这有所帮助。

我不确定它是否适用于Python2,因为我没有这样的环境。


0

我发现在matplotlib 3.3.4中,实际上可以使用鼠标左键(而不是右键)来绘制矩形并进行缩放,然后拔掉右键。此后,图像将被缩小。

至少对于matplotlib使用:

  • matplotlib.use("Qt5Agg")
  • 导航工具栏使用matplotlib.backends.backend_qt5agg.NavigationToolbar2QT

-1

你也可以用鼠标的滚轮拖动来缩放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接