2012-06-11 8 views
24

Ich zeichne Daten in Python mit Matplotlib. Ich aktualisiere die Daten des Plots basierend auf einigen Berechnungen und möchte, dass Ylim und Xlim automatisch skaliert werden. Stattdessen wird die Skala basierend auf den Grenzen der ursprünglichen Handlung festgelegt. Ein MWE istAutomatische Skalierung von Ylim und Xlim in Matplotlib

import random 
import matplotlib.pyplot as pyplot 

pyplot.ion() 

x = range(10) 
y = lambda m: [m*random.random() for i in range(10)] 

pLine, = pyplot.plot(x, y(1)) 

for i in range(10): 
    pLine.set_ydata(y(i+1)) 
    pyplot.draw() 

Der erste Plotbefehl ein Grundstück von [0,1] erzeugt, und ich kann alles gut sehen. Am Ende geht das y-Daten-Array von [0,10) mit dem größten davon größer als 1, aber die y-Grenzen der Figur bleiben [0,1].

Ich weiß, dass ich die Grenzen manuell mit pyplot.ylim(...) ändern kann, aber ich weiß nicht, zu was ich sie ändern soll. Kann ich pyplot in der for Schleife sagen, dass die Grenzen skaliert werden sollen, als wäre es das erste Mal, dass es geplottet wurde?

+2

diese beiden Antworten in Bezug Siehe: http://stackoverflow.com/a/3215060/623518 und http://stackoverflow.com/a/7198623/623518 – Chris

Antwort

34

Sie müssen die dataLim der Achsen aktualisieren und anschließend die viewLim der Achsen basierend auf dataLim aktualisieren. Die geeigneten Methoden sind axes.relim() und ax.autoscale_view() Methode. Ihr Beispiel sieht dann aus wie:

import random 
import matplotlib.pyplot as pyplot 

pyplot.ion() 

x = range(10) 
y = lambda m: [m*random.random() for i in range(10)] 

pLine, = pyplot.plot(x, y(1)) 

for i in range(10): 
    pLine.set_ydata(y(i+1)) 

ax = pyplot.gca() 

# recompute the ax.dataLim 
ax.relim() 
# update ax.viewLim using the new dataLim 
ax.autoscale_view() 
pyplot.draw() 
+7

Beachten Sie, dass, wenn Sie haben 'set_xlim()' auf den gleichen Achsen zuvor benutzt, 'autoscale_view()' funktioniert NICHT. In diesem Fall sollte 'autoscale()' stattdessen verwendet werden (getestet am 1.5.x). –

Verwandte Themen