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

时间:2014-04-03 08:25:01

标签: python-2.7 graph kivy

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

3 个答案:

答案 0 :(得分:8)

kivy garden中有一个图表小部件。您可以在kivy的documentation中阅读有关使用花园小部件的信息。

答案 1 :(得分:4)

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

Youscope

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

中看到youscope的演示

源代码在这里: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 with Kivy

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

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

Kivy的源代码与pygame代码非常相似,但在Kivy中没有带有while循环的游戏循环。 在Kivy中,您使用Clock.schedule_intervall(callback,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)正在运行,但会删除背景网格。

答案 2 :(得分:4)

定义你的情节

e.g。

plot = MeshLinePlot(color=next(colors))

定义图表

e.g。

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轴:

e.g。

    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]

拨打时钟

e.g。

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

并添加小部件:

        b.add_widget(graph)

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

相关问题