Python中的极简实时绘图

4
我一直在广泛使用Python从各种外部设备(从Arduino到示波器)中提取数据,我正在寻找一种简单的方法来绘制数据。在stackoverflow上已经有类似问题的答案: wxPython最佳实时绘图小部件是什么?。 大多数指向Eli Bendersky的这个好代码: http://eli.thegreenplace.net/2008/08/01/matplotlib-with-wxpython-guis/, 但代码的范围比我要寻找的要复杂得多。我正在寻找一些非常简约的东西,只需在数据从源流式传输时实时绘制数据 - 它不需要GUI、单选按钮、旋钮和滑块或类似的任何东西。调用pylab.plot()或pylab.show()等解决方案似乎无法给出正确的行为。有人有建议吗?

你尝试过这里提供的提示了吗?matplotlib动画 - cha0site
3个回答

4

好的,这不是一个wxPython的答案,但我曾经使用过Chaco来完成这样的事情,它非常简单。有一个很好的实时频谱分析器的例子,可能类似于您的用例,并且有一个很好的教程。所以,如果您没有因其他原因而绑定在wxPython上,那么这可能值得一看。


谢谢!Chaco看起来非常有用,而且正好适合我要使用它的那些事情。我会进一步了解它 :) - nathan lachenmyer
请注意,截至2015年2月8日,教程链接已失效。 - dcoz

1

1
要使用实时绘图,您需要向GUI循环发送信号。如果您使用交互模式(Ipython),则可能还需要使用线程。
我编写了一些装饰器,以非常简单和清晰的方式处理GUI和线程。它们适用于QT后端。 https://gist.github.com/Vrekrer/106c49a3ae6d420937aa 一个Ipython的示例代码将如下所示:
#%pylab qt

#https://gist.github.com/Vrekrer/106c49a3ae6d420937aa    
import QThreadDecorators
import time

@QThreadDecorators.GUI_Safe
def myplot(x,y):
    #This will plot a new line for each call (ok for an example)
    plot(x, y, 'bo-')
    grid(True)


@QThreadDecorators.AsQThread
def myLoop(x):
    y = x * nan
    for i, xi in enumerate(x):
        #get some data
        time.sleep(1)
        y[i] = xi**2
        #plot in real time
        myplot(x,y)

#just call the function and it will run on a thread
myLoop( arange(20) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接