matplotlib与PyQt绘制表面
我用matplotlib创建了一个3D图像,代码是这样的:
fig = pylab.figure()
ax = Axes3D( fig )
surf = ax.plot_surface( X, Y, Z, cmap=cm.gray_r, linewidth=0, antialiased=True )
fig.canvas.set_window_title( "Distance" )
pylab.show()
效果非常棒:我可以看到灰度的表面,并且可以与它互动(比如旋转表面、移动图形等等)。
现在我想把这个图放到一个PyQt的窗口里。我创建了一个从QMainWindow继承的类,代码如下:
class ViewerForm(QMainWindow):
def __init__(self, p_parent=None, p_data=None):
QMainWindow.__init__( self, parent=p_parent )
self.main_frame = QWidget( )
self.figure = pyplot.figure()
self.axis = Axes3D( self.figure )
self.canvas = FigureCanvas( self.figure )
self.canvas.setParent( self.main_frame )
self.mpl_toolbar = NavigationToolbar( self.canvas, self.main_frame )
self.X, self.Y = np.meshgrid( p_data[ "axis_x" ], p_data[ "axis_y" ] )
self.Z = p_data[ "values_z" ]
self.surface = self.axis.plot_surface( self.X, self.Y, self.Z, cmap=cm.gray, linewidth=0, antialiased=True )
vbox = QVBoxLayout( )
vbox.addWidget( self.canvas )
vbox.addWidget( self.mpl_toolbar )
self.main_frame.setLayout( vbox )
self.setCentralWidget( self.main_frame )
当我显示这个窗口时,我能看到和第一个图一样的灰度表面,但我无法与它互动:我不能通过鼠标点击来移动表面。有没有人能告诉我我哪里做错了,或者我理解错了什么?
2 个回答
1
我觉得你需要为鼠标点击注册一个回调函数,就像这个食谱示例中所展示的那样:http://www.scipy.org/Cookbook/Matplotlib/Interactive_Plotting
1
我之前也遇到过这个问题,搞得我很困惑。Zhenya说的关于鼠标点击的事情是对的。
默认情况下,当你清空或重新绘制图表时,鼠标控制会被关闭。我也不太明白为什么会这样,但你需要重新启动鼠标交互:
self.surface = self.axis.plot_surface( self.X, self.Y, self.Z, cmap=cm.gray, linewidth=0, antialiased=True )
self.axis.mouse_init()