我正在尝试绘制一个实时信号。我有一个大小为4的数组,每隔1/32秒用新数据刷新一次,我需要将这些值绘制至少1秒。
这意味着,每个大小为4的这些数组中有32个。这意味着,我将有32 * 4 = 128个数据点来绘制与样本数量(1,2,3 ...... 128)。我怎么能在python中绘制这个?我可以将数组(大小为4)返回给一个新方法,它会每1/32秒执行一次,所以我有数据但不知道如何处理它。
希望我能清楚地解释我的问题。我很感激这个问题的任何帮助。
答案 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包。它非常灵活,应该能够解决这个问题。