2016-07-19 12 views
0

Ich bin neu in Python matplotlib und möchte eine Figur in einer Schleife aktualisiert werden. Dies ist ein einfacher Testcode. Ich möchte 3 Grafiken zeichnen, jede für 2 Sekunden, mit verschiedenen Steigungen jedes Mal. Natürlich weiß ich, dass ich etwas mehr über matplotlib lesen sollte, aber ich muss etwas schnell machen. Was ist falsch unten? Vielen Dank!Update-Figur innerhalb der Schleife

#!/usr/bin/env python 

import matplotlib.pyplot as plt 
import numpy as np 
import time 

def demo(a): 
    y = [xt*a+1 for xt in x] 
    ax.plot(x,y) 

if __name__ == '__main__': 
    plt.ion() 
    fig, ax = plt.subplots() 
    ax.set_ylim([0,15]) 
    x = range(0,5) 
    for a in range(1,4): 
     demo(a) 
     time.sleep(2) 

Ich dachte plt.ion() es interaktiv und ax.plot(x,y) wirksam macht sofort (aber nicht erraten). Ich habe versucht, ax.draw() nach ax.plot(x,y) hinzuzufügen, aber es erfordert einige Argumente wie Künstler oder etwas, das ich noch nicht weiß :). Auch ich habe diese Fehlermeldung kommen (Ubuntu 14.04.LTS).

Xlib: extension "XInputExtension" missing on display ":1.0". 
X Error: BadDrawable (invalid Pixmap or Window parameter) 9 
    Major opcode: 62 (X_CopyArea) 
    Resource id: 0x0 

EDIT: Ich füge den richtigen Code unten. (Nach Estilus-Lösung, auf die modifizierte ich ein wenig für die korrekte Grafikanzeige.

#!/usr/bin/env python 

import matplotlib.pyplot as plt 
import numpy as np 
import time 

def demo(a): 
    plt.cla() 
    y = [xt*a+1 for xt in x] 
    ax.set_ylim([0,15]) 
    ax.plot(x,y) 

if __name__ == '__main__': 
    plt.ion() 
    fig, ax = plt.subplots() 
    x = range(5) 
    for a in range(1,4): 
     demo(a) 
     plt.pause(3) 
     plt.draw() 
+0

Mögliches Duplikat von [Wie aktualisiere ich ein Diagramm in matplotlib?] (Http://stackoverflow.com/questions/4098131/how-to-update-a-plot-in-matplotlib) –

+0

Mögliches Duplikat von [Mehrere definieren Diagramme, die mit einer for-Schleife in Matplotlib animiert werden sollen] (http://stackoverflow.com/questions/21937976/defining-multiple-plots-to-be-animated-with-a-for-loop-in-matplotlib) – hashcode55

Antwort

2

So plt.ion() Figur ziehen muss für eine kurze Zeit angehalten werden, um es interaktiv zu sein. Andernfalls rennen Sie einfach auf einen gefrorenen weißen Bildschirm. Zweitens möchten Sie draw() verwenden, um die Figur zu aktualisieren. Daher würde der Code wie folgt aussehen:

import matplotlib.pyplot as plt 
import numpy as np 
import time 

def demo(a): 
    y = [xt*a+1 for xt in x] 
    ax.plot(x,y) 

if __name__ == '__main__': 
    plt.ion() 
    fig, ax = plt.subplots() 
    ax.set_ylim([0,15]) 
    x = range(0,5) 
    for a in range(1,4): 
     demo(a) 
     plt.pause(3) 
     plt.draw() 

ich die Pausenzeit einstellen 3 Sekunden sein, aber es könnte eine ziemlich kleine Zahl sein, wenn man (wie 0,000001) möchten. Hoffe das hat geholfen!

+0

Hallo, das funktioniert. außer dass ich ax.set_ylim ([0,15]) in inside demo() verschoben habe.Ansonsten ist der Ylim nicht korrekt eingestellt. Vielen Dank! –

0

Es scheint, dass Sie versuchen, how to update a plot in matplotlib zu verstehen.

sollten Sie diesen Code verwenden, um zu verstehen, wie fig1.canvas.draw() zu verwenden, um aktualisieren Sie Ihre Diagramme Daten:.

fig1 = figure() 

for n in range(30): 

    ## Clear the figure 
    clf() 

    # Do a plot that changes for each iteration 
    plot(range(n)) 

    # Now set the xlimit so that it doesn’t change the plot 
    xlim((0,30)) 
    ylim((0,30)) 

    ## Now the magic, we must update the canvas 
    fig1.canvas.draw() 
0

Hier ist ein Code, der funktioniert Die wichtigsten Linien sind:

  • plt.cla(): um die Achse zwischen jeder Zeichnung zu löschen. Entfernen Sie diese Zeile, wenn Sie alle Grafiken beibehalten möchten.
  • fig.canvas.draw(): tatsächlich die Handlung in die Leinwand der

#!/usr/bin/env python 

import matplotlib.pyplot as plt 
import numpy as np 
import time 

def demo(a): 
    plt.cla() 
    y = [xt*a+1 for xt in x] 
    ax.set_ylim([0,200]) 
    ax.plot(x,y) 
    fig.canvas.draw() 

if __name__ == '__main__': 
    plt.ion() 
    fig, ax = plt.subplots() 
    x = range(5) 
    for a in range(40): 
     demo(a) 
     time.sleep(0.1) 
+0

I tat genau so, wie du es mir gezeigt hast, aber es gibt mir diesen Fehler. (vielleicht nicht Python bezogen). und ich sehe keine Zahlen, die ein kurzes, blinkendes Zahlenfenster nach ein paar Sekunden ausschließen. Xlib: Erweiterung "XInputExtension" fehlt auf dem Display ": 1.0". X-Fehler: BadDrawable (ungültiger Pixmap- oder Window-Parameter) 9 Hauptoperationscode: 62 (X_CopyArea) Ressourcen-ID: 0x0 –

+0

@ChanKim Dies ist nicht Python. Es ist ein Problem mit Ihrer grafischen Umgebung (virtuelle Maschine?) – Frodon

+0

Ich weiß, also habe ich Ihren Code auf meine CentOS6.7 Maschine kopiert, aber kein Bildfenster erscheint. Das Skript endet erst nach einigen Sekunden. Was könnte falsch sein? Sind Sie sicher, dass Ihr geänderter Code auf Ihrem Computer in Ordnung ist? –

Verwandte Themen