在Python中使用matplotlib和kivy进行实时绘图

时间:2017-12-12 17:42:24

标签: python matplotlib kivy

所以...我一直试图让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点。但我得到了这个:

好像画布没有重绘。我究竟做错了什么?

2 个答案:

答案 0 :(得分:1)

这可能与kivy无关。可以看出,轴限制很小,超出了数据所在的范围。一旦数据发生变化,更新限制是有意义的。最简单的方法是使用

self.ax.autoscale()

更新功能内部。

答案 1 :(得分:1)

正如@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()