我有一些python代码,每隔一段时间就会收到一条消息,其中包含时间戳和边沿转换,从低到高,或从高到低。我想在条形图上绘制每个过渡图,以便用最少的努力快速,简单地显示数字波形。
你能推荐一些方法或包吗?
我也不反对以csv格式导出数据,并将其加载到另一个程序中,如果这样更容易。
编辑:
试过CairoPlot:
>>> data = [(10, 0), (11, 1), (12.5, 0), (15, 1)]
>>> def fn(t):
... for d in data:
... if t > d[0]:
... return d[1]
... return data[-1][1]
...
>>> CairoPlot.function_plot( 'tester.png', data, 500, 300, discrete = True, h_bounds=( data[0][0],data[-1][0]), step = 1 )
这将我的CPU固定在100%超过10分钟,并且正在稳定地记忆。我在用尽掉掉所有掉之前把它杀掉了。我做错了什么还是CairoPlot刚破了?
进一步编辑:
我现在可以使用CairoPlot更加可行,基于上面的代码。然而,由于分辨率,它并不完美:我可能需要高达数十纳秒(1e-8)的分辨率才能捕获一些较短的脉冲。对于多秒图表,使用此方法需要非常长时间。
答案 0 :(得分:2)
我自己没有使用它,但也许Cairo Plot值得一看。
答案 1 :(得分:2)
Matplotlib可能有效。看一下这个strip chart demo。
答案 2 :(得分:1)
您可以尝试使用CairoPlot:
import CairoPlot
#the data list stands for your low-to-high (1) and high-to-low (0) data
data = lambda x : [0,0,1,1,0,0,1][x]
CairoPlot.function_plot( 'Up_and_Down', data, 500, 300, discrete = True, x_bounds=( 0,len(data) - 1 ), step = 1 )
有关详情,请查看CairoPlot
编辑:
我不明白你的函数fn(t)。 function_plot的想法是绘制函数而不是向量。
要绘制这些点,您可以通过以下方式使用function_plot:
#notice I have split your data into two different vectors,
#one for x axis and the other one for y axis
x_data = [10, 11, 12.5, 15]
y_data = [0, 1, 0, 1]
def get_data( i ):
if i in x_data :
return y_data[x_data.index(i)]
else :
return 0
CairoPlot.function_plot( 'Up_and_Down', get_data, 500, 300, discrete = True, x_bounds=( 0,20 ), step = 0.5 )
我想这会起作用
对于100%固定CPU,这不应该发生......我今天晚些时候会看看它。谢谢你的指点 \ o _
答案 3 :(得分:1)
#simple stripchart using pygame
import pygame, math, random
white=(255,255,255) #define colors
red=(255,0,0)
pygame.init() #initialize pygame
width=1000
height=200
size=[width,height] #select window size
screen=pygame.display.set_mode(size) #create screen
pygame.display.set_caption("Python Strip Chart")
clock=pygame.time.Clock()
data=[]
for x in range (0,width+1):
data.append([x,100])
# -------- Event Loop -----------
while (not pygame.event.peek(pygame.QUIT)): #user closed window
for x in range (0,width):
data[x][1]=data[x+1][1] #move points to the left
t=pygame.time.get_ticks() #run time in milliseconds
noise=random.randint(-10,10) #create random noise
data[width][1]=100.-50.*math.sin(t/200.) +noise #new value
screen.fill(white) #erase the old line
pygame.draw.lines(screen, red, 0,data,3) #draw a new line
clock.tick(150) #regulate speed
pygame.display.flip() #display the new screen
pygame.quit () #exit if event loop ends
答案 4 :(得分:0)
答案 5 :(得分:0)
GnuPlot在这里是一个老的可靠答案,很容易绘制图表,有很多选项。我相信有python绑定,但它可能更容易导出您的数据并通过常规gnuplot运行它。这是一个古老的quick start doc。
我也在使用matplotlib,并且在更大的数据量方面取得了巨大的成功。
答案 6 :(得分:0)
对于仅使用tkinter的实时条带图应用程序(无需外部软件包),请参阅What is the best real time plotting widget for wxPython?。
如果我理解您的问题,您将以纳秒分辨率时间戳实时接收消息,但您不希望每秒看到10 ^ 9条消息。如果平均消息速率很低(每秒100条消息或更少),我只是忽略时间戳并一次绘制一条消息的转换。如果图形时间刻度是每像素10毫秒,那么将在40毫秒内绘制4个过渡,但至少你不会错过看到发生的事情。