2010-05-27 4 views
1

3 개의 그림이있는 그림 캔버스가 있다고 가정합니다 ... 2는 같은 크기의 이미지를 imshow로 그렸고 다른 하나는 다른 종류의 하위 그림입니다. imshow 플롯의 x 축과 y 축을 연결할 수있어서 NavigationToolbar에서 제공하는 줌 도구를 사용하여 하나를 확대 할 때 다른 좌표가 동일한 좌표로 확대되고 하나를 이동할 때 다른 팬들도 마찬가지입니다.줌 및 패닝을 위해 imshow 플롯의 축을 어떻게 연결할 수 있습니까?

scatter 및 histogram과 같은 서브 플로트 방법은 sharex 및 sharey에 대한 축을 지정하는 kwargs를 전달할 수 있지만 imshow에는 이러한 구성이 없습니다.

NavigationToolbar2WxAgg (아래 참조)를 하위 클래스로 분류하여이 문제를 해결하기 시작했습니다.하지만 여기에는 몇 가지 문제가 있습니다. 1) 캔버스에있는 모든 플롯의 축을 연결합니다. 왜냐하면 내가 한 일은 a.in_axes()에 대한 검사를 없애기 때문입니다. 2) 이것은 패닝에 적합하지만 줌 기능을 사용하면 모든 서브 플로트가 각각의 축 각각에서 동일한 점이 아닌 동일한 전역 점.

해결 방법을 제안 할 수 있습니까?

감사합니다. -Adam

from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg 
class MyNavToolbar(NavigationToolbar2WxAgg): 
    def __init__(self, canvas, cpfig): 
     NavigationToolbar2WxAgg.__init__(self, canvas) 

    # overrided 
    # As mentioned in the code below, the only difference here from overridden 
    # method is that this one doesn't check a.in_axes(event) when deciding which 
    # axes to start the pan in... 
    def press_pan(self, event): 
     'the press mouse button in pan/zoom mode callback' 

     if event.button == 1: 
      self._button_pressed=1 
     elif event.button == 3: 
      self._button_pressed=3 
     else: 
      self._button_pressed=None 
      return 

     x, y = event.x, event.y 

     # push the current view to define home if stack is empty 
     if self._views.empty(): self.push_current() 

     self._xypress=[] 
     for i, a in enumerate(self.canvas.figure.get_axes()): 
      # only difference from overridden method is that this one doesn't 
      # check a.in_axes(event) 
      if x is not None and y is not None and a.get_navigate(): 
       a.start_pan(x, y, event.button) 
       self._xypress.append((a, i)) 
       self.canvas.mpl_disconnect(self._idDrag) 
       self._idDrag=self.canvas.mpl_connect('motion_notify_event', self.drag_pan) 

    # overrided 
    def press_zoom(self, event): 
     'the press mouse button in zoom to rect mode callback' 
     if event.button == 1: 
      self._button_pressed=1 
     elif event.button == 3: 
      self._button_pressed=3 
     else: 
      self._button_pressed=None 
      return 

     x, y = event.x, event.y 

     # push the current view to define home if stack is empty 
     if self._views.empty(): self.push_current() 

     self._xypress=[] 
     for i, a in enumerate(self.canvas.figure.get_axes()): 
      # only difference from overridden method is that this one doesn't 
      # check a.in_axes(event) 
      if x is not None and y is not None and a.get_navigate() and a.can_zoom(): 
       self._xypress.append((x, y, a, i, a.viewLim.frozen(), a.transData.frozen())) 

     self.press(event) 

답변

3

내가 sharex이 add_subplot에 전달 될 수 몰랐어요 ...

f = plt.figure() 
ax1 = f.add_subplot(211) 
ax2 = f.add_subplot(212, sharex=ax1, sharey=ax1) 
ax1.imshow(np.random.randn(10,10), interpolation='nearest') 
ax2.imshow(np.random.randn(10,10), interpolation='nearest') 
f.canvas.draw() 

그러나, 당신은 이미지를 표시하기 위해 귀하의 축 개체를 설정하려면 다음을 수행하려고합니다. 내가 대신

ax1.set_adjustable("box-forced") 
ax2.set_adjustable("box-forced") 

사용할 수 있습니다

ValueError: adjustable must be "datalim" for shared axes 

하기 matplotlib들 말해,하지만하기 matplotlib 버전 0.98.5.3을 사용하여 나를 위해 작동하지 않습니다

ax1.axis('image') 

당신은 얻을 것이다 ... 나는 그것이 새로운 버전과 함께 할 것이라고 생각한다. 소식을 듣고 업데이트됩니다.