그래서 ... 저는 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 점 각 초 음모 얻고 싶었다 :
여기에 코드입니다. 하지만 그 대신 나는이 얻을 : 캔버스를 다시 그릴되지 같은
보인다. 내가 도대체 뭘 잘못하고있는 겁니까?
:
다음 코드가 문제를 해결해야한다. 그러나 내가 말할 수있는 것은 임베디드 플롯과 함께 Tkinter를 사용한다면'plt.draw()'를 사용하여 플롯을 업데이트 할 수 없다는 것입니다. 오히려 당신은'self.plt_canvas.draw_idle()'를 부를 것입니다. 그래서 이전에 Tkinter로 작업했다고 말했을 때 실제로 어떤 GUI에 플롯을 포함 시켰습니까? 아니면 여기 같은 클래스 내에서 모든 파이 Plot 메소드를 호출 했습니까? 사용중인 kivy 백엔드가'plt.draw() '를 전혀 허용하지 않는다고 상상할 수도 있습니다. – ImportanceOfBeingErnest
스케쥴러를 사용하고'self.line.set_xdata()'를 사용하여 메소드를 호출하는 것이 효과적이라고 말하면서 효과적입니다. 물론 코드는 kivy와 함께 작동하도록 편집해야했습니다. 하지만 공식 [예제] (https://github.com/kivy-garden/garden.matplotlib/blob/master/examples/test_plt.py)에 따르면'plt.draw()'를 사용하는 데 문제가 없습니다. –