如何在wxPython中使用鼠标旋转matplotlib 3D图?

时间:2015-02-06 21:41:12

标签: python matplotlib wxpython

以下是我用于在wxPython应用程序中显示2D matplotlib图的代码片段:

import matplotlib
matplotlib.use('WXAgg')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
from matplotlib.figure import Figure
import wx

[wxPython application and class code snipped]

    figure = Figure()
    axes = figure.add_subplot(111)
    canvas = FigureCanvasWxAgg(self, wx.ID_ANY, figure)
    plotSizer = wx.BoxSizer(wx.VERTICAL)
    plotSizer.Add(self, canvas, proportion=1, flag=wx.EXPAND)
    plotPanel = wx.Panel(self, wx.ID_ANY, size=DEFAULT_PLOT_SIZE)
    plotPanel.SetSizer(plotSizer)

我可以绘制轴,重绘画布并平移和缩放。当我尝试使用3D进行等效操作时,会显示3D绘图,但我无法旋转/平移/缩放。此代码的唯一区别是3D的额外导入和add_subplot()的投影参数的添加。

import matplotlib
matplotlib.use('WXAgg')
from mpl_toolkits.mplot3d import axes3d
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
from matplotlib.figure import Figure
import wx

[wxPython application and class code snipped]

    figure = Figure()
    axes = figure.add_subplot(111, projection="3d")
    canvas = FigureCanvasWxAgg(self, wx.ID_ANY, figure)
    plotSizer = wx.BoxSizer(wx.VERTICAL)
    plotSizer.Add(self, canvas, proportion=1, flag=wx.EXPAND)
    plotPanel = wx.Panel(self, wx.ID_ANY, size=DEFAULT_PLOT_SIZE)
    plotPanel.SetSizer(plotSizer)

我收到了这个警告:

...\site-packages\mpl_toolkits\mplot3d\axes3d.py:1009: UserWarning: Axes3D.figure.canvas is 'None', mouse rotation disabled.  Set canvas then call Axes3D.mouse_init().

所以我在调用FigureCanvasWxAgg()后尝试使用此代码设置Axes3D.figure.canvas:

axes.figure.canvas = canvas
axes.mouse_init()

但这不起作用;我仍然无法使用鼠标旋转3D绘图。

http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html的演示源代码,它使用独立的matplotlib工作;我可以用鼠标旋转那里的情节。使用wxPython时如何让鼠标旋转工作?

1 个答案:

答案 0 :(得分:2)

原来我只需要交换画布和轴创建的顺序。应首先创建画布并将其添加到图形中,然后可以创建3D轴。

figure = Figure()
canvas = FigureCanvasWxAgg(self, wx.ID_ANY, figure)
axes = figure.add_subplot(111, projection="3d")
plotSizer = wx.BoxSizer(wx.VERTICAL)
plotSizer.Add(self, canvas, proportion=1, flag=wx.EXPAND)
plotPanel = wx.Panel(self, wx.ID_ANY, size=DEFAULT_PLOT_SIZE)
plotPanel.SetSizer(plotSizer)