Múltiples escalas Y, pero solo una habilitada para panorámica y zoom

Considere el siguiente código de Python para trazar una figura matplotlib:

import matplotlib.pylab as pp
import numpy as np

alpha = np.linspace(0, 2 * np.pi, 400)
sig1 = np.sin(alpha)
sig2 = np.sin(2 * alpha) + 2 * (alpha > np.pi)

ax1 = pp.subplot(111)
ax2 = ax1.twinx()

ax1.plot(alpha, sig1, color='b')
ax2.plot(alpha, sig2, color='r')
ax1.set_ylabel('sig1 value', color='b')
ax2.set_ylabel('sig2 value', color='r')
pp.grid()
pp.show()

Dándome una buena trama

enter image description here

Me gustaría saber cómo deshabilitar uno de los ejes para la panorámica/zoom, de modo que cuando use la herramienta de panorámica/zoom, solo ax2 cambiará la escala, por ejemplo. ¿Hay alguna forma de hacer esto? Quiero hacerlo programáticamente.

preguntado el 08 de marzo de 13 a las 21:03

Sospecho que tendrá que escribir una devolución de llamada para actualizar el segundo eje cuando cambie el primero. pan/zoom son actividades a nivel de eje y no está claro cómo desea que los dos ejes y generados por twinx se vinculen genéricamente. Funciona para el eje x porque usan los mismos objetos subyacentes para el eje x. -

2 Respuestas

Puedes hacer esto usando ax2.set_navigate(False):

from matplotlib.pyplot import *
import numpy as np

fig,ax1 = subplots(1,1)
ax2 = ax1.twinx()
ax2.set_navigate(False)
x = np.linspace(0,2*np.pi,100)
ax1.plot(x,np.sin(x),'b')
ax1.set_xlabel('Scaleable axis')
ax1.set_ylabel('Scaleable axis')
ax2.plot(x,np.sin(x+1),'r')
ax2.set_ylabel('Static axis',weight='bold')

respondido 28 mar '13, 23:03

Tenía la sensación de que habría una forma integrada de hacer esto. Gracias por averiguarlo. La "necesidad" de esto me ha ocurrido una o dos veces, pero parece que no estoy en una gran multitud. - Blunt

Sí, parece una característica bastante específica. ¡Me sorprendió bastante que existiera! Por curiosidad para que lo usas? - ali_m

Tengo datos de medidas. Uno es una señal de voltaje pulsante y, por ejemplo, lecturas de flujo que varían con el tiempo. Entonces, analizar el flujo relacionado con el voltaje es más conveniente con la escala de voltaje fija. fabulus. - Blunt

No es una función de nicho si la combinación de tener dos ejes verticales y usar el modo panorámico no es también una función de nicho. Por lo general, los dos ejes son para cantidades de diferentes dimensiones, no solo para diferentes unidades (por ejemplo, mmHg y mbar), que es uno de los casos raros de ejes naturalmente vinculados que puedo pensar. Entonces, un comportamiento predeterminado podría ser afectar solo al eje definido primero. O para determinar el eje direccionado por el usuario en función de la posición inicial del mouse. - Rainald62

Un ejemplo un poco más complejo con dos áreas de trazado y tres ejes verticales. Solo el eje horizontal común y el eje vertical izquierdo de la subparcela inferior son interactivos.

fig, ax_left = plt.subplots()
ax_right = ax_left.twinx()
ax_status = make_axes_locatable(ax_left).append_axes('top', size=1.2, pad=0., sharex=ax_left)
ax_status.xaxis.set_tick_params(labelbottom=False)
ax_right.set_navigate(False)
ax_status.set_navigate(False)

Antes de agregar set_navigate(False) de acuerdo con la respuesta de ali_m, los dos ejes verticales del gráfico inferior se vieron afectados al arrastrar el mouse verticalmente en el gráfico inferior, mientras que el eje de estado no se vio afectado como debería pero sólo después del primer gesto del ratón. Al arrastrar el mouse por primera vez, todos los ejes se ven afectados. Esto parece ser un error en matplotlib, recién informado como #12613.

Respondido 24 Oct 18, 12:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.