346 Stimmen

Wie kann ich in Echtzeit in einer while-Schleife mit matplotlib plotten?

Ich versuche, einige Daten von einer Kamera in Echtzeit mit OpenCV zu zeichnen. Allerdings scheint die Echtzeit-Darstellung (mit matplotlib) nicht zu funktionieren.

Ich habe das Problem in diesem einfachen Beispiel isoliert:

fig = plt.figure()
plt.axis([0, 1000, 0, 1])

i = 0
x = list()
y = list()

while i < 1000:
    temp_y = np.random.random()
    x.append(i)
    y.append(temp_y)
    plt.scatter(i, temp_y)
    i += 1
    plt.show()

Ich würde erwarten, dass in diesem Beispiel 1000 Punkte einzeln dargestellt werden. Was tatsächlich passiert, ist, dass das Fenster mit dem ersten Punkt zeigt (ok mit, dass), dann wartet auf die Schleife zu beenden, bevor es den Rest des Diagramms füllt.

Haben Sie eine Idee, warum ich die Punkte nicht einzeln aufführe?

34voto

BrenBarn Punkte 228691

show ist wahrscheinlich nicht die beste Wahl für diese Aufgabe. Was ich tun würde, ist zu verwenden pyplot.draw() stattdessen. Sie können auch eine kleine Zeitverzögerung einbauen (z. B., time.sleep(0.05) ) in der Schleife, damit Sie sehen können, wie die Plots ablaufen. Wenn ich diese Änderungen an Ihrem Beispiel vornehme, funktioniert es bei mir und ich sehe, dass jeder Punkt einzeln angezeigt wird.

18voto

Scott Punkte 2438

Ich weiß, diese Frage ist alt, aber es gibt jetzt ein Paket namens Auslosung auf GitHub als "python-drawnow". Dies bietet eine Schnittstelle ähnlich wie MATLABs Drawow - Sie können einfach eine Zahl aktualisieren.

Ein Beispiel für Ihren Anwendungsfall:

import matplotlib.pyplot as plt
from drawnow import drawnow

def make_fig():
    plt.scatter(x, y)  # I think you meant this

plt.ion()  # enable interactivity
fig = plt.figure()  # make a figure

x = list()
y = list()

for i in range(1000):
    temp_y = np.random.random()
    x.append(i)
    y.append(temp_y)  # or any arbitrary update to your figure's data
    i += 1
    drawnow(make_fig)

python-drawnow ist ein dünner Wrapper um plt.draw bietet aber die Möglichkeit der Bestätigung (oder Fehlersuche) nach der Zahlenanzeige.

8voto

Hamid Fadishei Punkte 752

Eine weitere Option ist die Verwendung von Bokeh . IMO ist es eine gute Alternative, zumindest für Echtzeit-Plots. Hier ist eine Bokeh-Version des Codes in der Frage:

from bokeh.plotting import curdoc, figure
import random
import time

def update():
    global i
    temp_y = random.random()
    r.data_source.stream({'x': [i], 'y': [temp_y]})
    i += 1

i = 0
p = figure()
r = p.circle([], [])
curdoc().add_root(p)
curdoc().add_periodic_callback(update, 100)

und für die Durchführung:

pip3 install bokeh
bokeh serve --show test.py

bokeh zeigt das Ergebnis in einem Webbrowser über Websocket-Kommunikation an. Dies ist besonders nützlich, wenn die Daten von entfernten Headless-Server-Prozessen erzeugt werden.

bokeh sample plot

6voto

slehar Punkte 311

Hier ist eine Version, die ich auf meinem System zum Laufen gebracht habe.

import matplotlib.pyplot as plt
from drawnow import drawnow
import numpy as np

def makeFig():
    plt.scatter(xList,yList) # I think you meant this

plt.ion() # enable interactivity
fig=plt.figure() # make a figure

xList=list()
yList=list()

for i in np.arange(50):
    y=np.random.random()
    xList.append(i)
    yList.append(y)
    drawnow(makeFig)
    #makeFig()      The drawnow(makeFig) command can be replaced
    #plt.draw()     with makeFig(); plt.draw()
    plt.pause(0.001)

Die Zeile drawnow(makeFig) kann durch eine Sequenz makeFig(); plt.draw() ersetzt werden, und es funktioniert immer noch gut.

6voto

Nilani Algiriyage Punkte 27476

Ein Beispiel für einen Anwendungsfall zur Darstellung der CPU-Nutzung in Echtzeit.

import time
import psutil
import matplotlib.pyplot as plt

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

i = 0
x, y = [], []

while True:
    x.append(i)
    y.append(psutil.cpu_percent())

    ax.plot(x, y, color='b')

    fig.canvas.draw()

    ax.set_xlim(left=max(0, i - 50), right=i + 50)
    fig.show()
    plt.pause(0.05)
    i += 1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X