2011-10-26 4 views
2

나는이 같이하기 matplotlib 사용하여 3D 플롯을 만들어 :하기 matplotlib와 PyQt는이

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) 

나는이 폼을 표시 할 때 내가 처음 플롯으로 그레이 스케일의 표면을 볼 수 있지만 나는이와 상호 작용할 수 없습니다 : 나는 이동할 수 없습니다 마우스로 서페이스를 클릭하십시오. 누구나 내가 잘못하고있는 것을 말하거나 오해 한 것을 말할 수 있습니까? http://www.scipy.org/Cookbook/Matplotlib/Interactive_Plotting

답변

1

내가 전에이 있었고 그것은 나에게 많은 혼란 :

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() 
관련 문제