python中快速而脏的条形图?

时间:2009-02-17 14:30:40

标签: python graphing stripchart

我有一些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)的分辨率才能捕获一些较短的脉冲。对于多秒图表,使用此方法需要非常长时间。

7 个答案:

答案 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)

http://bitworking.org/projects/sparklines/为您提供了一个小图。

答案 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个过渡,但至少你不会错过看到发生的事情。