Python Plot live Update?
Hi zusammen.
Ich möchte in Python einen Live-Plot haben (siehe Beispielanimation hier: https://pythonprogramming.net/static/images/matplotlib/live-matplotlib-graph-tutorial.gif).Das ganze funktioniert bisher, jedoch nur in einem separaten Figure Window. Ich möchte nun diesen "animierten" Plot mit "canvas" auf eine "tkinter" GUI bringen. Beim Ausführen wartet er aber immer ab, bis die komplette Schleife durchlaufen ist und plotted dann nur das Gesamtergebnis. Ich sehe keine Live-Updates. Eine Idee, wie man das hinbekommt?
Ohne die tkinter GUI kann man das erreichen mit matplotlib.pyplot.pause(). Wenn ich das bei canvas anwende, öffnet er an der Stelle aber wieder ein separates Figure. Er updated den Plot nicht in der GUI.
from tkinter import *
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
import matplotlib.pyplot as plt
import time
root = Tk()
figId = plt.figure(1)
plot1 = plt.subplot(211)
plot2 = plt.subplot(212)
plt.draw()
canvas = FigureCanvasTkAgg(figId, master=root)
canvas.get_tk_widget().pack()
vals1 = [5, 6]
vals2 = [-3, 9]
i = 0
while(i<2):
plot1.plot(i,vals1[i],'x')
plot2.plot(i,vals2[i],'x')
i += 1
time.sleep(2)
2 Antworten
Der Link zum Bild ist: https://pythonprogramming.net/static/images/matplotlib/live-matplotlib-graph-tutorial.gif
gutefrage lässt mich den Thread nicht editieren.
Das ist die Lösung:
import random
from itertools import count
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from tkinter import *
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
x_vals = []
y_vals1 = []
y_vals2 = []
index = count()
root = Tk()
figId = plt.figure()
canvas = FigureCanvasTkAgg(figId, master=root)
canvas.get_tk_widget().pack()
canvas.draw()
def animate(i):
x_vals.append(next(index))
y_vals1.append(random.randint(0, 5))
y_vals2.append(random.randint(0, 5))
plt.cla()
plt.plot(x_vals, y_vals1)
plt.plot(x_vals, y_vals2)
ani = FuncAnimation(plt.gcf(), animate, interval=1000)
root.mainloop()