在Python中使用Matplotlib和Kivy进行实时绘图 [英] Real-time plotting using matplotlib and kivy in Python
问题描述
所以...我一直在尝试使用matplotlib来绘制实时绘制的实时数据.我以前在TkInter中使用过与此代码类似的代码,它的工作原理就像一个魅力,所以我很困惑为什么它在这里不起作用.
so... I've been trying to get kivy to plot data generated in real time, using matplotlib. I've used similar code to this one before in TkInter and it worked like a charm so I'm really confused why it does not work here.
代码如下:
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点.但是我得到了这个:
I wanted to get it to plot the line, 1 point each second. But instead I get this:
似乎画布没有重新绘制.我究竟做错了什么?
Seems like the canvas is not redrawing. What am I doing wrong?
推荐答案
如@ImportanceOfBeingErnest所建议,需要更新轴限制.
As suggested by @ImportanceOfBeingErnest, the axes limits need to be updated.
以下代码可以解决您的问题:
The following code should solve your problem:
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中使用Matplotlib和Kivy进行实时绘图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!