matplotlib与PyQt绘制表面

2 投票
2 回答
1932 浏览
提问于 2025-04-17 05:02

我用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()

撰写回答