matplotlib和PyQt绘制表面

时间:2011-10-26 14:40:18

标签: python matplotlib pyqt geometry-surface

我使用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 个答案:

答案 0 :(得分:1)

我认为您需要为鼠标点击注册回调函数,例如本食谱示例:http://www.scipy.org/Cookbook/Matplotlib/Interactive_Plotting

答案 1 :(得分:1)

我之前有这个,它让我很困惑。振亚对鼠标点击是对的。

默认情况下,清除/重新绘制轴时,将关闭鼠标控制图。我不知道为什么会这样,但你需要再次启动鼠标交互:

self.surface = self.axis.plot_surface( self.X, self.Y, self.Z, cmap=cm.gray, linewidth=0, antialiased=True )
self.axis.mouse_init()