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)