如何在 PyQt4 小部件中嵌入的 Axes3D (matplotlib) 中启用旋转?

Posted

技术标签:

【中文标题】如何在 PyQt4 小部件中嵌入的 Axes3D (matplotlib) 中启用旋转?【英文标题】:How to enable rotation in an Axes3D (matplotlib) embedded in a PyQt4 widget? 【发布时间】:2011-12-12 13:41:49 【问题描述】:

我正在使用以下问题中显示的方法在 PyQt4 小部件中嵌入 Axes3D:

Qt4 + mplot3d of matplotlib

启动应用程序时,我无法再通过鼠标移动来旋转轴。我需要做什么才能再次启用轮播?

【问题讨论】:

【参考方案1】:

任何时候你调用类似Axes3D.clear()的东西,然后再次启用鼠标旋转你必须调用Axes3D.mouse_init()

似乎没有记录,但它对我有用! Source

【讨论】:

【参考方案2】:

我遇到了同样的问题,经过深度调试后解决了。问题是画布实例的不一致。示例代码首先构造一个图形,该图形自动为图形提供画布实例。然后将一个轴添加到图形中,然后将图形的画布替换为另一个可以用作QWidget的画布。

但是,Axes3D 构造函数将回调函数添加到其图形的画布以实现旋转功能。因此,如果在此之后更换画布,与旋转功能的连接就会丢失。

在将坐标轴添加到图中之前,只需调用 FigureCanvas.__init__() 就足够了,但我还没有尝试过。

我的工作解决方案有点不同:首先我调用matplotlib.use("Qt4Agg") 来设置正确的后端。接下来,我使用fig = matplotlib.pyplot.figure() 构建图形,确保它们已经包含正确的画布,然后将Axes3D 添加到它们。我只是作为数据元素fig.canvas 访问画布并将其用作QWidget。在构造任何图形之前调用QtGui.QApplication() 也很重要。

【讨论】:

我想我实际上正在这样做,但它不起作用。也许您可以在pastebin.com/Y7Fcsnpp 上查看我的代码(46 行),并且可能对出了什么问题有所了解。【参考方案3】:

我遇到了类似的问题,但我的轴不会出现。我调用了FigureCanvas.__init__(),然后按照Björn 的建议通过调用self.ax = self.fig.add_subplot(111, projection='3d') 将轴添加到图形中

【讨论】:

【参考方案4】:

在这里,在 Python 3 中,设置全局变量 self.ax 后,我通过调用 self.ax.mouse_init() 打开了鼠标旋转。也许对你有帮助。

self.fig = Figure(figsize = (5,5), dpi = 100)
self.ax = self.fig.add_subplot(1,1,1, projection='3d')
self.canvas = FigureCanvasTkAgg(self.fig, root)
self.ax.mouse_init()
self.canvas.draw()
self.canvas.get_tk_widget().grid()

【讨论】:

欢迎来到 Stack Overflow!一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决了问题,那么答案会更有帮助。

以上是关于如何在 PyQt4 小部件中嵌入的 Axes3D (matplotlib) 中启用旋转?的主要内容,如果未能解决你的问题,请参考以下文章

使用 QtDesigner PyQt4 创建自定义小部件

PyQt4 - 自定义小部件类结构?

在 PyQt4 的嵌入式 matplotlib 图中使用 ginput

PyQt4:使用 QPushButton 小部件从 QList 小部件中删除项目

使用 PyQt4 或 PySide 捕获屏幕,除了特定的小部件?

开发 pyqt4 树小部件