Быстрый и грязный стрипчарт в питоне? - PullRequest
2 голосов
/ 17 февраля 2009

У меня есть некоторый код Python, который время от времени получает сообщение, содержащее метку времени и граничный переход, от низкого к высокому или от высокого к низкому. Я хотел бы отобразить каждый переход на полосковой диаграмме для быстрой и грязной визуализации цифрового сигнала с минимальными усилиями.

Можете ли вы порекомендовать какие-либо методы или пакеты, которые облегчили бы это?

Я также не против экспортировать данные, например, в формате csv и загружать их в другую программу, если это будет проще.

Edit:

Пробный 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 )

Это закрепило мой процессор на 100% в течение более 10 минут и постоянно потребляло память. Я убил его, пока он не использовал весь обмен. Я что-то не так делаю или CairoPlot просто сломался?

Дальнейшее редактирование:

Теперь у меня есть кое-что более работоспособное с использованием CairoPlot, основанное на приведенном выше коде. Тем не менее, он не идеален из-за разрешения: мне может понадобиться разрешение до десятков наносекунд (1e-8), чтобы уловить некоторые из более коротких импульсов. Для мультисекундного графика этот метод занимает очень много времени.

Ответы [ 7 ]

2 голосов
/ 17 февраля 2009

Matplotlib может работать. Взгляните на эту демо-диаграмму .

2 голосов
/ 17 февраля 2009

Я сам им не пользуюсь, но, возможно, Каирский участок стоит посмотреть.

1 голос
/ 10 января 2016
#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
1 голос
/ 17 февраля 2009

Вы можете попробовать использовать 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

Edit:

Я не понял вашу функцию 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% -ного закрепления ЦПУ это не должно произойти ... Я посмотрю на это позже сегодня. Спасибо за указание \ O_

0 голосов
/ 30 сентября 2011

Для приложения для работы с полосами в реальном времени, использующего только tkinter (внешние пакеты не требуются), см. Какой лучший виджет для построения графиков в реальном времени для wxPython? .

Если я понимаю ваш вопрос, вы получаете сообщения в режиме реального времени с временными метками с наносекундным разрешением, но не ожидаете увидеть 10 ^ 9 сообщений в секунду. Если средняя скорость сообщений низкая (100 сообщений в секунду или меньше), я просто проигнорирую метку времени и нанесу на график переходы по одному сообщению за раз. Если временная шкала графика равна 10 мс на пиксель, 4 перехода будут отображаться в течение 40 мс, но, по крайней мере, вы не упустите возможность увидеть, что что-то произошло.

0 голосов
/ 17 февраля 2009

GnuPlot - это старый надежный ответ здесь, простой график с большим количеством опций. Я считаю, что есть привязки Python, но, вероятно, проще экспортировать ваши данные и запустить их через обычный gnuplot. Вот древний документ для быстрого старта для него.

Я также использую matplotlib с большим успехом для больших объемов данных.

0 голосов
/ 17 февраля 2009

http://bitworking.org/projects/sparklines/ предоставляет маленький график для вас.

...