在Python中使用Matplotlib和Kivy进行实时绘图 [英] Real-time plotting using matplotlib and kivy in Python

查看:854
本文介绍了在Python中使用Matplotlib和Kivy进行实时绘图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以...我一直在尝试使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆