2

次のように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 )

このフォームを表示すると、最初のプロットとしてグレースケールでサーフェスを表示できますが、これを操作することはできません。マウスでクリックしてサーフェスを移動することはできません。誰もが私が間違っていることや私が誤解していることを私に言うことができますか?

4

2 に答える 2

1

このクックブックの例のように、マウスクリックのコールバック関数を登録する必要があると思います:http ://www.scipy.org/Cookbook/Matplotlib/Interactive_Plating

于 2011-10-26T15:49:27.973 に答える
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()
于 2011-10-31T10:58:48.713 に答える