Matplotlib / Pyplot: ¿Cómo acercar subtramas juntas?

81

Tengo gráficos de datos de series de tiempo del acelerómetro de 3 ejes (t, x, y, z) en subtramas separadas que me gustaría acercar. Es decir, cuando uso la herramienta "Zoom a rectángulo" en un gráfico, cuando suelto el mouse, los 3 gráficos hacen zoom juntos.

Anteriormente, simplemente trazaba los 3 ejes en un solo gráfico usando diferentes colores. Pero esto es útil solo con pequeñas cantidades de datos: tengo más de 2 millones de puntos de datos, por lo que el último eje trazado oscurece los otros dos. De ahí la necesidad de subtramas separadas.

Sé que puedo capturar eventos de mouse matplotlib / pyplot (http://matplotlib.sourceforge.net/users/event_handling.html), y sé que puedo capturar otros eventos (http://matplotlib.sourceforge.net/api/backend_bases_api .html # matplotlib.backend_bases.ResizeEvent), pero no sé cómo saber qué zoom se ha solicitado en una subparcela y cómo replicarlo en las otras dos subtramas.

Sospecho que tengo todas las piezas y solo necesito esa última pista preciosa ...

-BobC

BobC
fuente
En mi opinión, la mejor documentación es el código de ejemplo que proporcionan: matplotlib.org/examples/pylab_examples/shared_axis_demo.html
Trevor Boyd Smith
1
¡Cierto! Ojalá existiera esa página cuando hice mi pregunta. Tan bueno que está ahí ahora.
BobC

Respuestas:

120

La forma más sencilla de hacerlo es utilizando las palabras clave sharexy / o shareyal crear los ejes:

from matplotlib import pyplot as plt

ax1 = plt.subplot(2,1,1)
ax1.plot(...)
ax2 = plt.subplot(2,1,2, sharex=ax1)
ax2.plot(...)
Rayo
fuente
33

También puedes hacer esto con plt.subplots, si ese es tu estilo.

fig, ax = plt.subplots(3, 1, sharex=True, sharey=True)
Jeremy McGibbon
fuente
-1

Interactivamente, esto funciona en ejes separados

for ax in fig.axes:
    ax.set_xlim(0, 50)
fig.draw()
n1nj4
fuente