Matplotlib и PyQt строят поверхность - PullRequest
2 голосов
/ 26 октября 2011

Я создал трехмерный график, используя matplotlib, как это:

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 голос
/ 31 октября 2011

У меня было это раньше, и это меня сильно смутило.Женя прав насчет щелчка мышью.

По умолчанию управление графиком с помощью мыши отключается, когда ось очищается / реплотируется.Я понятия не имею, почему это так, но вам нужно снова начать взаимодействие с мышью:

self.surface = self.axis.plot_surface( self.X, self.Y, self.Z, cmap=cm.gray, linewidth=0, antialiased=True )
self.axis.mouse_init()
1 голос
/ 26 октября 2011

Я думаю, вам нужно зарегистрировать функцию обратного вызова для щелчков мыши, как в этом примере поваренной книги: http://www.scipy.org/Cookbook/Matplotlib/Interactive_Plotting

...