2011-08-25 39 views
23

Tengo que dibujar varias líneas en los mismos ejes, y cada una de ellas se actualiza dinámicamente (yo uso set_data), el problema es que no conozco los límites xey de cada una de las líneas. Y axes.autoscale_view (True, True, True)/axes.set_autoscale_on (True) no están haciendo lo que se supone que deben hacer. ¿Cómo escalo automáticamente mis ejes?set_data y autoscale_view matplotlib

import matplotlib.pyplot as plt 

fig = plt.figure() 
axes = fig.add_subplot(111) 

axes.set_autoscale_on(True) 
axes.autoscale_view(True,True,True) 

l1, = axes.plot([0,0.1,0.2],[1,1.1,1.2]) 
l2, = axes.plot([0,0.1,0.2],[-0.1,0,0.1]) 

#plt.show() #shows the auto scaled. 

l2.set_data([0,0.1,0.2],[-1,-0.9,-0.8]) 

#axes.set_ylim([-2,2]) #this works, but i cannot afford to do this. 

plt.draw() 
plt.show() #does not show auto scaled 

me he referido a estos ya, this, this. En todos los casos que he encontrado, se conocen los límites x, y. Tengo varias líneas en los ejes y sus rangos de cambio, hacer el seguimiento de la ymax para toda los datos no es práctico

Un poco de explorar me llevó a esto,

xmin,xmax,ymin,ymax = matplotlib.figure.FigureImage.get_extent(FigureImage) 

Pero aquí de nuevo, i no sé cómo acceder a FigureImage desde la instancia de Figure.

Usando matplotlib 0.99.3

Respuesta

31

Desde el matplotlib docs for autoscale_view:

Los límites de datos no se actualizan automáticamente cuando se cambian los datos de artista después de que el artista se ha añadido a una instancia ejes. En ese caso, use matplotlib.axes.Axes.relim() antes de llamar autoscale_view.

Por lo tanto, tendrá que añadir dos líneas antes de su llamada plt.draw() después de la llamada set_data:

axes.relim() 
axes.autoscale_view(True,True,True) 
+1

Gracias! ¡Eso funcionó como el encanto! – chaitu