2013-10-24 7 views
7

Ich möchte eine bestimmte Linie in einem Diagramm aus mehreren Linien entfernen. Nachstehend ist ein Beispiel, das für mich nicht ausreicht, weil es nur die letzte gezeichnete Linie entfernt und nicht die Linie, die ich entfernen möchte. Wie kann ich das machen? Wie kann ich eine bestimmte Zeile (Name, Nummer, Referenz) im gesamten Programm ansprechen und diese Zeile löschen?Matplotlib - So entfernen Sie eine bestimmte Linie oder Kurve

self.axes.lines.remove(self.axes.lines[0]) 

Antwort

13

Fast alle der Plotten Funktionen geben einen Hinweis auf die artist Objekt erstellt ex:

ln, = plot(x, y) # plot actually returns a list of artists, hence the , 
im = imshow(Z) 

Wenn Sie die Referenz haben, können Sie einen Künstler über die remove(doc) Funktion ex entfernen:

ln.remove() 
im.remove() 
10

Wenn Sie die Referenz aller Zeilen nicht explizit speichern möchten, aber Sie den Index der Zeile, die Sie entfernen möchten, kennen kann die Tatsache nutzen, dass maptplotlib sie für dich speichert.

self.axes.lines 

ist eine Liste von matplotlib.lines.Line2D. So entfernen Sie zB gezogen die zweite Zeile, die Sie

self.axes.lines[1].remove() 
+0

Ich rate dringend von dieser Verwendung ab. Es beruht auf einer Anzahl von Dingen, die interne Details von Matplotlib sein sollen und macht nicht das Richtige, wenn Sie es zweimal tun. – tacaswell

+0

Das war das einzige, was für mich funktionierte, danke. –

1

tun kann ich das gleiche Bedürfnis hatte und für mich, es stellte sich heraus, aufgeräumter zu sein, um eine ID zu der Datenreihe hinzufügen und entfernen später durch die Suche nach Serie (Sammlung) mit der angegebenen ID.

def add_series(x, id): 
    plt.plot(x, gid = id) 

def remove_series(id): 
    for c in plt.collections: 
    if c.get_gid() == id: 
     c.remove() 
+0

Was ist 'plt.collections' hier? – tacaswell

+0

PLT ist eine Achse. Das Element "Collections" enthält im Grunde alles, was den Plot umfasst, einschließlich der Datenreihen, die mit dem Befehl plot() erstellt wurden. – Andrew

+0

Das ist sehr verwirrend, da Matplotlib ein Collections-Modul hat (welches normalerweise nicht in 'matplotlib.pyplot' importiert wird, was per Konvention als' plt' importiert wird). – tacaswell

0
import numpy as np 
import matplotlib.pyplot as plt 

The following programme runs on version 3.6. 
Code generates a pair of lines and the line 2 is removed in a for loop which 
simulates a comet effect 
pts=100 
t2 = np.linspace(0.0,5.0,pts) 
t2=(t2/50) 
tm=t2*(10**3) 
nz=t2.size 
tc=np.linspace(0.8,2.5,2) 
nz=tc.size 
for n in range (nz): 
    print(tc[n]) 
    resp = 1 - np.exp(-tc[n]*tm*10**-3*50) * np.cos(2*np.pi*50*tm*10**-3) 
    for m in range(pts): 
     plt.xlim(0,100) 
     plt.ylim(0,2) 
     plt.xlabel('Time,in milliseconds',fontsize=12) 
     plt.ylabel('Respose',fontsize=12) 
     plt.title('Underdamped Second Order System Step Response',fontsize=14) 
     line1,=plt.plot(tm[0:m+1],resp[0:m+1],color='black',linewidth=0.2) 
     line2,=plt.plot(tm[m],resp[m],marker='o',color='red',markersize=5) 
     ax = plt.gca() 
     plt.pause(0.02) 
     ax.lines.remove(line2) 
     plt.grid('on') 
plt.show() 
0

Der Code in meiner Antwort erzeugt für wenig gedämpftes System zweiter Ordnung Sprungantwort. Der Code kann auch verwendet werden, um die Überlagerung von Plots zu veranschaulichen. Der Code erzeugt und zeigt grafisch die Antwort für zwei Werte des Zeitkonstantenparameters an. Der Code veranschaulicht auch die Erstellung von Kometen in einer for-Schleife.