Hallo,
ich habe folgendes Problem. Über einen Taster wird ein Interrupt ausgelöst, der einen Parameter verändert. Durch das Ändern des Parameters soll der Graf gleichzeitig aktualisiert werden. Im Moment habe ich das einfach so programmiert, dass wenn der Taster gedrückt wird, der komplette Graf neu erstellt wird und über den alten gezeichnet wird. Doch dann dauert es immer sehr lange, bis der neue Graf angezeigt wird.
Hat jemand eine Idee, wie man den alten Graf nicht komplett überschreibt, sondern nur die Linie neu plotten lässt, damit der neue Graf schneller angezeigt werden kann?
In der Anzeige, in der der Parameter verändert wird, benutzt man sowas wie .config... gibt es soetwas auch für den plot? Habe auch irgendwas mit line, gelesen, aber bin nicht schlau daraus geworden.
Wäre super, wenn mir jemand weiterhelfen könnte =)
Plot von Matplotlib durch Interrupt (eines Tasters) erneuern
@Python1234: Schau Dir mal die Beispiele für Animationen auf der Matplotlib-Webseite an.
-
- User
- Beiträge: 9
- Registriert: Mittwoch 18. September 2013, 16:31
Danke für den Hinweis. Habe jetzt auch ein Programm gefunden, das so ähnlich funktioniert, wie ich das will, nämlich dieses hier:
Mein Problem ist jetzt, dass mein Diagramm im Tkinter GUI eingebunden ist und es meine Tkinter GUI öffnet, aber das Diagramm in einem extra Fenster öffnet und ich es nicht hinbekomme, dass es in dem Fenster vom Tkinter das Diagramm malt. Drückt man auf den Knopf, führt das Programm auch nichts aus... ich denke das Problem liegt am ion(), aber ohne diesen Befehl macht das Programm nichts.
Nun aber mein Programmcode:
Irgendwelche Ideen, was ich falsch mache?!? Vielen Dank im Vorraus, für eure Antwort.
Code: Alles auswählen
from pylab import *
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(23, GPIO.IN)
ion()
i = 0
x = arange(0,2*pi,0.01) # x-array
line, = plot(x,sin(x))
draw()
while True:
if GPIO.input(23):
i=i+0.1
line.set_ydata(sin(x+i/10.0)) # update the data
line.set_xdata(x+i)
draw() # redraw the canvas
Nun aber mein Programmcode:
Code: Alles auswählen
import matplotlib
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import Tkinter as Tk
import RPi.GPIO as GPIO
from pylab import *
GPIO.setmode(GPIO.BOARD)
GPIO.setup(23, GPIO.IN)
ion()
i=0
def Knopf1(Diagramm_erneuern):
global i
i=i+0.1
a.line.set_ydata(sin(x+i/10.0)) # update the data
a.line.set_xdata(x+i)
canvas.draw()
# Interrupt Event hinzufuegen. Pin 23, auf steigende Flanke reagieren und ISR "Interrupt" deklarieren
GPIO.add_event_detect(23, GPIO.RISING, callback = Knopf1, bouncetime = 2)
# GUI
root = Tk.Tk()
f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)
x = arange(0,2*pi,0.01)
y = sin(x)
a.line, = plot(x,y)
# a tk.DrawingArea
canvas = FigureCanvasTkAgg(f, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
Tk.mainloop()
-
- User
- Beiträge: 9
- Registriert: Mittwoch 18. September 2013, 16:31
also ich habs jetzt so weit, dass es erneuert, aber das Gridfenster verschiebt es und löscht die alte Linie. Hat dazu jemand eine Idee????
Code: Alles auswählen
import matplotlib
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import Tkinter as Tk
import RPi.GPIO as GPIO
from pylab import *
GPIO.setmode(GPIO.BOARD)
GPIO.setup(23, GPIO.IN)
i=0
def Knopf1(Diagramm_erneuern):
global i
global x
global y
i=i+0.1
y = sin(x+i/10.0) # update the data
x = x+i
canvas.restore_region(background)
line[0].set_data(x,y)
a.draw_artist(line[0])
canvas.blit(a.bbox)
GPIO.add_event_detect(23, GPIO.RISING, callback = Knopf1, bouncetime = 200)
# GUI
root = Tk.Tk()
f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)
x = arange(0,2*pi,0.01)
y = sin(x)
line=a.plot(x,y)
# a tk.DrawingArea
canvas = FigureCanvasTkAgg(f, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
background=canvas.copy_from_bbox(a.bbox)
Tk.mainloop()