Do the “sharex” and “sharey” kwargs help?

http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.axes

http://matplotlib.sourceforge.net/examples/pylab_examples/shared_axis_demo.html

-paul

 

From: Adam Fraser [mailto:adam.n.fraser@gmail.com]
Sent: Thursday, May 27, 2010 10:44 AM
To: matplotlib-users
Subject: [Matplotlib-users] Is there a way to link axes of imshow plots?

 

Suppose I have a figure canvas with 3 plots... 2 are images of the same dimensions plotted with imshow, and the other is a scatterplot. I'd like to be able to link the x and y axes of the imshow plots so that when I zoom in one, the other zooms to the same coordinates, and when I pan in one, the other pans as well.

 

I started hacking my way around this by subclassing NavigationToolbar2WxAgg (shown below)... but there are several problems here.

1) This will link the axes of all plots in a canvas since all I've done is get rid of the checks for a.in_axes()

2) This worked well for panning, but zooming caused all subplots to zoom from the same global point, rather than from the same point in each of their respective axes.

 

Can anyone suggest a workaround?

 

Much thanks!

-Adam

 

from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar

class MyNavToolbar(NavigationToolbar):

    def __init__(self, canvas, cpfig):

        NavigationToolbar.__init__(self, canvas)

        

    # override

    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)

    

    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)