簡體   English   中英

在 Python 中使用 matplotlib 和 kivy 進行實時繪圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM