[英]Real-time plotting using matplotlib and kivy in Python
所以...我一直在尝试让 kivy 使用 matplotlib 绘制实时生成的数据。 我之前在 TkInter 中使用过与此类似的代码,它的作用就像一种魅力,所以我真的很困惑为什么它在这里不起作用。
这是代码:
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 个点。 但是我得到了这个:
似乎画布没有重绘。 我究竟做错了什么?
可能这与奇异果无关。 可以看出,轴的限制很小,并且超出了数据所在的范围。 更改数据后,有必要更新限制。 最简单的方法是使用
self.ax.autoscale()
在更新功能中。
如@ImportanceOfBeingErnest所建议,轴限制需要更新。
以下代码可以解决您的问题:
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()
使用 python-3.7 kivy-2.0.0 matplotlib-3.5.1 Marines 代码抛出
回溯(最近一次调用):文件“c:\\Users\\wiredworks\\Documents\\Simulation-Studio2\\StudioInterface\\MatplotlibUpdate.py”,第 32 行,在 MyApp().run() 文件“C:\\ProgramData\\Anaconda3\\ envs\\NewPanda3d\\lib\\site-packages\\kivy\\app.py”,第 949 行,运行 self._run_prepare() 文件“C:\\ProgramData\\Anaconda3\\envs\\NewPanda3d\\lib\\site-packages\\kivy\\app. py”,第 919 行,在 _run_prepare root = self.build() 文件“c:\\Users\\wiredworks\\Documents\\Simulation-Studio2\\StudioInterface\\MatplotlibUpdate.py”,第 21 行,在构建 plt.show() 文件“C :\\ProgramData\\Anaconda3\\envs\\NewPanda3d\\lib\\site-packages\\matplotlib\\pyplot.py", line 368, in show return _backend_mod.show(*args, **kwargs) File "C:\\ProgramData\\Anaconda3\\envs \\NewPanda3d\\lib\\site-packages\\matplotlib\\backend_bases.py”,第 3579 行,在调用中返回 self.show(block=block) 文件“C:\\ProgramData\\Anaconda3\\envs\\NewPanda3d\\lib\\site-packages\\matplotlib \\backend_bases.py”,第 3544 行,显示 cls.mainloop() 类型错误:mainloop() 缺少 1 个必需的位置参数: '自己'
解决这个问题:
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
plt.plot()
class MyApp(App):
def build(self):
box = BoxLayout()
self.i = 0
self.line = [self.i]
box.add_widget(canvas)
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.