绘制变化的数组

时间:2011-08-17 04:30:28

标签: python

我正在尝试绘制一个实时信号。我有一个大小为4的数组,每隔1/32秒用新数据刷新一次,我需要将这些值绘制至少1秒。

这意味着,每个大小为4的这些数组中有32个。这意味着,我将有32 * 4 = 128个数据点来绘制与样本数量(1,2,3 ...... 128)。我怎么能在python中绘制这个?我可以将数组(大小为4)返回给一个新方法,它会每1/32秒执行一次,所以我有数据但不知道如何处理它。

希望我能清楚地解释我的问题。我很感激这个问题的任何帮助。

2 个答案:

答案 0 :(得分:1)

我喜欢将wxPython用于实时的事情。这是一个示例应用程序,可以满足您的要求。它在窗口中检索生成的读数和图。

(因为我看不到你的数据,我在一个单独的线程中生成一个正弦波并绘制它)

import wx
from Queue import Queue, Empty, Full
import threading
from time import sleep
from math import sin
from itertools import count

class Producer(threading.Thread):
    def __init__(self,queue):
        self.queue=queue
        self.t=0
        threading.Thread.__init__(self)
        self.daemon=False


    def run(self):
        print "initializing producer"
        freq=0.1
        secondsBetweenReadings=1.0/32
        try:
            while True:
                readings=[ 256.0*sin(freq*t) for t in range(self.t,self.t+4) ]
                self.t = self.t+4
                self.queue.put(readings,timeout=0.1)
                sleep(secondsBetweenReadings)
        except Full:
            print "Queue Full. Exiting"

class App(wx.App):
    def __init__(self,queue):
        self.queue=queue
        wx.App.__init__(self,redirect=False)

    def OnInit(self):
        self.frame=wx.Frame(parent=None,size=(256,256))
        self.plotPanel=wx.Panel(self.frame,size=(256,256))
        self.plotPanel.SetBackgroundColour(wx.BLACK)
        self.data=[]
        self.plotPanel.Bind(wx.EVT_PAINT,self.OnPaintPlot)
        self.plotPanel.Bind(wx.EVT_ERASE_BACKGROUND,lambda evt: None) #For Windows
        self.Bind(wx.EVT_IDLE,self.CheckForData)
        self.frame.Show()
        return True

    def CheckForData(self,evt):
        try:
            data=self.queue.get(timeout=0.05)
            self.data.extend(data)
            self.plotPanel.Refresh()
        except Empty:
            pass
        evt.RequestMore()


    def OnPaintPlot(self,evt):
        w,h=self.plotPanel.GetClientSize()
        dc=wx.PaintDC(self.plotPanel)
        dc.SetBrush(wx.BLACK_BRUSH)
        dc.DrawRectangle(0,0,w,h)
        dc.SetPen(wx.WHITE_PEN)
        coords=zip(count(),self.data)
        if len(coords) > 2:
            dc.DrawLines(coords)


if __name__ == "__main__":
    maxReadings=32
    queue=Queue(maxReadings)
    producer=Producer(queue)
    plotterApp=App(queue)

    producer.start()
    plotterApp.MainLoop()

答案 1 :(得分:0)

查看rtgraph包。它非常灵活,应该能够解决这个问题。