问题 如何在kivy中创建实时图表?


我想在kivy中创建一个实时图表。我怎样才能实现这一目标?我是kivy的新手。请帮帮我。


11239
2018-04-03 08:25


起源



答案:


中有一个图形小部件 基维花园。您可以阅读有关在kivy中使用花园小部件的信息 文件


7
2018-04-03 10:59



它支持直方图吗? - João Abrantes
我不这么认为。我们今年可能在matplotlib支持中有一个gsoc项目。 - inclement


答案:


中有一个图形小部件 基维花园。您可以阅读有关在kivy中使用花园小部件的信息 文件


7
2018-04-03 10:59



它支持直方图吗? - João Abrantes
我不这么认为。我们今年可能在matplotlib支持中有一个gsoc项目。 - inclement


我也想在Kivy做一个实时图表。

Youscope

我开始使用Youscope。您可以在以下YouTube视频中看到youscope的演示 https://www.youtube.com/watch?v=-1E0DpQ_cFo

源代码在这里: https://code.google.com/p/felipesanches/source/browse/trunk/youscope-emu/youscope-emu.py

它是用Pygame编写的,并使用波形音频文件作为输入源,但您也可以使用其他来源(例如串行数据或计算曲线)。

Youscope的问题在于我无法从中构建适用于Android的APK。我已经尝试为android安装python子集,但我总是在构建时得到错误消息。 (没弄清楚出了什么问题。)

所以我决定将Youscope代码移植到Kivy,因为使用Buildozer我可以制作Android APK。 (尚未经过测试以构建图形应用程序,但这应该可行。)

Youscope与Kivy

绘图似乎与原始代码一样快,但目前我仍然在重绘曲线。但我认为绘图应该更快,也许计算得分时间太长。 我想我应该检查一个WAV文件作为输入,如果它更快。

Clock.schedule_intervall(Kivy)与游戏循环(Pygame)

Kivy的源代码与pygame代码非常相似,但在Kivy中没有带有while循环的游戏循环。 在Kivy中,你使用Clock.schedule_intervall(回调,time_in_sec)进行回调(参见 http://kivy.org/docs/api-kivy.clock.html)用于更新/绘制屏幕。

使用framebuffer进行绘图

对于绘图,您需要使用添加到画布的帧缓冲区。看到 http://kivy.org/docs/api-kivy.graphics.fbo.html

曲线从左到右逐点绘制。 通过重绘我的意思是我在帧缓冲区绘制第一条曲线(我使用计算的正弦波),在我到达屏幕的右边缘后,我再次使用新曲线从左侧绘制。

现在仍然需要清除之前绘制的曲线。您可以在此处重绘整个屏幕,但这可能比逐点删除旧行更慢。

这里的困难是恢复旧曲线下面的背景颜色。看起来我得到了错误像素的颜色,但我不确定是什么问题。

Get_pixel_color()用于刷新屏幕

使用Framebuffer.get_pixel_color(wx,wy)(需要Kivy 1.8.0),您可以获得rgba中像素的颜色,但这样做不正常。也许这是一个更新问题,但我不确定。

使用黑色像素清除(没有get_pixel_color)正在工作,但这会删除背景网格。


4
2018-04-16 22:03





定义你的情节

例如

plot = MeshLinePlot(color=next(colors))

定义图

例如

graph = Graph(
    xlabel='Iteration',
    ylabel='Value',
    x_ticks_minor=1,
    x_ticks_major=5,
    y_ticks_major=1,
    y_grid_label=True,
    x_grid_label=True,
    padding=5,
    xlog=False,
    ylog=False,
    x_grid=True,
    y_grid=True,
    ymin=0,
    ymax=11,
    **graph_theme)

更新图表并更新x轴:

例如

    def update_xaxis(self,*args):
        global graph
        global cnt
        graph.xmin = cnt - 50
        graph.xmax = cnt

    def update_points(self, *args):
        global i
        global MYLIST
        global cnt

        #self.plot.points = [(i,i)]
        self.plot.points = [z for z in MYLIST]

叫一个时钟

例如

        Clock.schedule_interval(self.update_points, 1/60.)
        Clock.schedule_interval(self.update_xaxis, 1/60.)

并添加小部件:

        b.add_widget(graph)

我希望我没有忘记任何事情。它为您提供了kivy Garden的运行图。


4
2018-06-26 19:44