2014-01-03 2 views
0

У меня есть одна фигура с 3 осями. Я соединяюсь с mpl_connect с 2 из них на 'pick_event', который что-то делает на 3-й оси. Пример (я опускаем нерелевантные переменные и некоторые части кода, чтобы сделать его более ясным и простым):Несколько холстов соединений на том же рисунке

class ManualElimination: 
    def __init__(self): 
     self.fig=figure() 
     self.cid2=None 
     self.cid1=None 
     self.data1=None 
     self.data2=None 
     nrows=2 
     ncols=4 
     self.ax1=plt.subplot2grid((nrows, ncols), (0, 0), colspan=1, rowspan=1) 
     self.ax2=plt.subplot2grid((nrows, ncols), (0, 1), colspan=1, rowspan=1) 
     self.ax4=plt.subplot2grid((nrows, ncols), (1, 0), colspan=ncols-1, rowspan=1) 
     self._replot() 
    def _onpick_plot_2(self, event): 
     try: 
      self.x=self.cat[self.keys[self.ind]].members[int(self.data2[event.ind[0],-1])] 
      self.pickedid=self.x.id 
      self._replot() 
      self._onpick_plot_flux() 
     except: 
      self.x=None 
      self.pickedid=None 
      self._replot() 
      pass 
    def _onpick_plot_1(self, event): 
     try: 
      self.x=self.cat[self.keys[self.ind]].members[int(self.data1[event.ind[0],-1])] 
      self.pickedid=self.x.id 
      self._replot() # I need this to plot the selected point in different color; this is not included in this code example to make it more simple 
      self._onpick_plot_flux() 
     except: 
      self.x=None 
      self.pickedid=None 
      self._replot() 
      pass 
    def _onpick_plot_flux(self): 
     x=self.x 
     self.ax4.cla() 
     sp = np.loadtxt(filename) 
     self.ax4.plot(sp[:,0], sp[:,1]) 
     show() 

    def _replot(self): 
     self._clear_axes() # not defined in this example; clears all 4 axes 
     self._get_data_all() # not defined here, affects self.data1 and self.data2 

     if self.data1 is not None: 
      self.line=self.ax1.scatter(self.data1[:,2], self.data1[:,0], picker=5) 
      self.cid1=self.fig.canvas.mpl_connect('pick_event', self._onpick_plot_1) 

     if self.data2 is not None: 
      self.line=self.ax2.scatter(self.data2[:,2], self.data2[:,0], picker=5) 
      self.cid2=self.fig.canvas.mpl_connect('pick_event', self._onpick_plot_2) 

     self.fig.canvas.show() 

Когда я выбрать точку на одной из осей (ax1 или ax2), кажется, что случайный функция (self._onpick_plot_1 или self._onpick_plot_2). Соединения имеют разные идентификаторы (self.cid1!=self.cid2). Как вызвать правильную функцию, соответствующую оси, где была выбрана точка?

+0

Проблема решена: сначала я использую 'axes_enter_event' для обнаружения на каждой оси, а затем подключаюсь к' pick_event', где передаю соответствующую функцию в качестве аргумента. Пример: 'if event.inaxes == self.ax1: self.fig.mpl_connect ('pick_event', self._onpick_plot_1)'. –

+0

Ответьте на свой вопрос в качестве ответа (и принимайте его, когда система позволит вам). – tacaswell

ответ

0

Я решил проблему, используя сначала axes_enter_event для обнаружения на каждой оси, а затем подключаюсь к pick_event, где передаю соответствующую функцию в качестве аргумента. Пример: if event.inaxes==self.ax1: self.fig.mpl_connect('pick_event', self._onpick_plot_1).

Смежные вопросы