2017-12-01 1 views
0

Ich versuche, dynamische Anzahl von Künstlern in der Update-Funktion der Animation zu zeichnen. Insbesondere wollte ich die Peaks einer Spektraldichtekurve mit beweglicher Leistung beschriften. Es gibt keine Garantie, dass die Anzahl der Spitzen wird das gleiche sein, so kann ich nicht verwenden text.set_text, hier ist was ich verwenden:Matplotlib Animation zeichnen dynamische Künstler ohne Blit

def update(i): 
    global line, frequency, psdmatrix, text, recordline, ax 
    text.set_text('Period ' + str(i)) 
    line.set_data(frequency, psdmatrix[i]) 
    maxlist = get_max(psdmatrix[i]) 
    texts = [] 
    for each in maxlist: 
     freq = frequency[each[0]] 
     texts.append(ax.text(freq, each[1]*3, 'Peak %.02f' % freq)) 
    return line, recordline, texts 

jedoch Texte nicht selbst mit jeder Iteration löschen, anstatt sie übereinander gestapelt, mit wenigen Iterationen gibt es Hunderte von Textkünstlern. Gibt es einen effizienten Weg, wo ich die Texte loswerden kann, ohne andere stabilere Elemente loszuwerden? Ich bin auf Mac, also kann ich Blit = True nicht verwenden. Das resultierende Bild ist wie folgt aus:

All the texts objects are on top of each other

Dank!

+0

Wenn das einzige Problem ist, 'blit = true' zu ​​verwenden, würde ich es erraten funktioniert, wenn Sie ein anderes Backend verwenden, z 'importieren Sie Matplotlib; matplotlib.use ("TkAgg") '. Es scheint sogar, dass das Macos-Backend [sollte jetzt Animationen unterstützen] (https://github.com/matplotlib/matplotlib/pull/6178). – ImportanceOfBeingErnest

Antwort

0

Sie können die alten Texte aus der Abbildung entfernen, bevor Sie neue erstellen. Definieren Sie texts außerhalb der Funktion und durchlaufen Sie sie, um die alten Texte zu entfernen und zu löschen. Folgendes sollte daher mit blit=False arbeiten:

texts = [] 

def update(i): 
    global line, frequency, psdmatrix, text, recordline, ax 
    text.set_text('Period ' + str(i)) 
    line.set_data(frequency, psdmatrix[i]) 
    maxlist = get_max(psdmatrix[i]) 
    for t in texts: 
     t.remove() 
     del t 
    texts[:] = [] 
    for each in maxlist: 
     freq = frequency[each[0]] 
     texts.append(ax.text(freq, each[1]*3, 'Peak %.02f' % freq)) 

(. Beachten Sie, dass dies wegen des Mangels an MCVE ungetestet)

Verwandte Themen