Pregunta

Supongamos que tengo un lienzo con la figura 3 parcelas ... 2 son imágenes de las mismas dimensiones trazadas con imshow, y el otro es algún otro tipo de trama secundaria. Me gustaría ser capaz de vincular los ejes X e Y de las parcelas imshow de modo que cuando el zoom en una (con la función de zoom proporcionado por el NavigationToolbar), los otros acercamientos a las mismas coordenadas, y cuando me PAN en una , los otros cacerolas también.

métodos trama secundaria, tales como la dispersión y el histograma se puede kwargs pasaron la especificación de un ejes para sharex y Sharey, pero imshow no tiene tal configuración.

Me empezó a cortar mi forma de evitar esto subclasificando NavigationToolbar2WxAgg (mostrada a continuación) ... pero hay varios problemas aquí. 1) Esto vinculará los ejes de todas las parcelas en un lienzo ya que todo lo que he hecho es deshacerse de los cheques para a.in_axes () 2) Esto funcionó bien para la expansión, pero el uso del zoom causó todos los argumentos secundarios para hacer zoom desde el mismo punto global, en lugar de desde el mismo punto en cada uno de sus respectivos ejes.

Puede alguien sugerir una solución?

Muchas gracias! -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)
¿Fue útil?

Solución

No me di cuenta sharex se podrían pasar a 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()

Sin embargo, si se intenta hacer lo siguiente para establecer sus objetos eje para la visualización de imágenes.

ax1.axis('image')

obtendrá:

ValueError: adjustable must be "datalim" for shared axes

Los chicos matplotlib me dicen que puede utilizar

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

En su lugar, pero no funciona para mí usando matplotlib versión 0.98.5.3 ... supongo que lo haría con una nueva versión. Se actualizará cuando escucho espalda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top