2017-12-12 17 views
0

그래서 ... 저는 kiply가 matplotlib를 사용하여 실시간으로 생성 된 플롯 데이터를 얻으려고 노력했습니다. 나는 TkInter에서 이전에 이와 비슷한 코드를 사용했고 매력처럼 작동했기 때문에 여기서는 왜 작동하지 않는지 혼란 스럽습니다.matplotlib와 kivy를 파이썬에서 사용하여 실시간 플로팅

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() 

나는 그것이 라인, 1 점 각 초 음모 얻고 싶었다 :

여기에 코드입니다. 하지만 그 대신 나는이 얻을 : 캔버스를 다시 그릴되지 같은

보인다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+1

:

다음 코드가 문제를 해결해야한다. 그러나 내가 말할 수있는 것은 임베디드 플롯과 함께 Tkinter를 사용한다면'plt.draw()'를 사용하여 플롯을 업데이트 할 수 없다는 것입니다. 오히려 당신은'self.plt_canvas.draw_idle()'를 부를 것입니다. 그래서 이전에 Tkinter로 작업했다고 말했을 때 실제로 어떤 GUI에 플롯을 포함 시켰습니까? 아니면 여기 같은 클래스 내에서 모든 파이 Plot 메소드를 호출 했습니까? 사용중인 kivy 백엔드가'plt.draw() '를 전혀 허용하지 않는다고 상상할 수도 있습니다. – ImportanceOfBeingErnest

+1

스케쥴러를 사용하고'self.line.set_xdata()'를 사용하여 메소드를 호출하는 것이 효과적이라고 말하면서 효과적입니다. 물론 코드는 kivy와 함께 작동하도록 편집해야했습니다. 하지만 공식 [예제] (https://github.com/kivy-garden/garden.matplotlib/blob/master/examples/test_plt.py)에 따르면'plt.draw()'를 사용하는 데 문제가 없습니다. –

답변

1

잠재적으로 이것은 kivy와 관련이 없습니다. 보시다시피 축 한계는 작고 데이터가있는 범위 밖에 있습니다. 데이터가 변경되면 제한을 업데이트하는 것이 좋습니다. 가장 쉬운 방법은 업데이트 기능 내에

self.ax.autoscale() 

을 사용하는 것입니다.

0

@ImportanceOfBeingErnest가 제안한대로 축 제한을 업데이트해야합니다. 내가 kivy에 대한 아무런 단서가 없다

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()