2017-12-12 3 views
0

so ... Ich habe versucht, kivy zu erhalten, um Daten in Echtzeit erstellt, mit Matplotlib. Ich habe in TkInter schon einen ähnlichen Code benutzt und es funktionierte wie ein Zauber, also bin ich wirklich verwirrt, warum es hier nicht funktioniert.Echtzeit-Plotten mit Matplotlib und Kivy in Python

Hier ist der Code:

import numpy as np 
import matplotlib 
matplotlib.use('module://kivy.garden.matplotlib.backend_kivy') 
from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.clock import Clock 
import matplotlib.pyplot as plt 

class MyApp(App): 
    def build(self): 
     box = BoxLayout() 

     self.fig,self.ax = plt.subplots(1) 
     self.plt_canvas = self.fig.canvas 
     box.add_widget(self.plt_canvas) 

     self.line = self.ax.plot([])[0] 
     self.i = 0 
     plt.show() 
     Clock.schedule_interval(self.update, 1) 

     return box 

    def update(self, *args): 
     self.line.set_xdata(np.arange(self.i)) 
     self.line.set_ydata(np.arange(self.i)) 
     self.i +=1 

     plt.draw() 

MyApp().run() 

ich es haben wollte, die Linie zu zeichnen, 1 Punkt pro Sekunde. Aber anstatt das ich bekommen:

scheint, wie die Leinwand neu zu zeichnen ist nicht. Was mache ich falsch?

+1

ich keine Ahnung, was auch immer über Kivy haben. Aber was ich sagen kann, ist, dass wenn Sie Tkinter mit einem eingebetteten Plot verwenden, Sie 'plt.draw()' nicht verwenden würden, um ein Plot zu aktualisieren. Eher würden Sie 'self.plt_canvas.draw_idle()' nennen. Also, als du gesagt hast, dass es vorher mit Tkinter funktionierte, hast du den Plot tatsächlich in irgendeine GUI eingebettet oder hast du einfach alle pyplot Methoden aus einer Klasse wie hier aufgerufen? Ich könnte mir gut vorstellen, dass das verwendete kivy-Backend gar nicht "plt.draw()" erlaubt. – ImportanceOfBeingErnest

+1

Mit der Aussage, es funktionierte, bevor ich meinte, dass der Aufruf der Methode mit Scheduler und die Verwendung von 'self.line.set_xdata()' funktionierte. Natürlich musste der Code editiert werden, um mit kivy zu arbeiten. Aber nach offiziellen [Beispiel] (https://github.com/kivy-garden/garden.matplotlib/blob/master/examples/test_plt.py) gibt es keine Probleme mit 'plt.draw()'. –

Antwort

1

Möglicherweise hat das nichts mit Kivy zu tun. Wie zu sehen ist, sind die Achsengrenzen klein und außerhalb des Bereichs, in dem sich die Daten befinden. Es ist sinnvoll, die Grenzwerte nach der Änderung der Daten zu aktualisieren. Der einfachste Weg wäre, innerhalb der Update-Funktion

zu verwenden.

0

Wie von @ImportanceOfBeingErnest vorgeschlagen, müssen die Achsenlimits aktualisiert werden.

Der folgende Code sollte Ihr Problem lösen:

import matplotlib 
matplotlib.use('module://kivy.garden.matplotlib.backend_kivy') 
from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.clock import Clock 
import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 
canvas = fig.canvas 


class MyApp(App): 
    def build(self): 
     box = BoxLayout() 
     self.i = 0 
     self.line = [self.i] 
     box.add_widget(canvas) 
     plt.show() 
     Clock.schedule_interval(self.update, 1) 
     return box 

    def update(self, *args): 
     plt.plot(self.line, self.line) 
     self.i += 1 
     self.line.append(self.i) 
     canvas.draw_idle() 


MyApp().run()