2 Stimmen

Schnelles und schmutziges Stripchart in Python?

Ich habe einige Python-Code, der eine Nachricht empfängt so oft mit einem Zeitstempel und eine Flanke Übergang, entweder niedrig-zu-hoch oder hoch-zu-low. Ich möchte jeden Übergang auf einem Streifendiagramm für eine schnelle und schmutzige Visualisierung der digitalen Wellenform mit der minimalen Menge an Aufwand zu grafisch darstellen.

Können Sie irgendwelche Methoden oder Pakete empfehlen, die dies vereinfachen?

Ich habe auch nichts dagegen, die Daten z. B. im csv-Format zu exportieren und sie in ein anderes Programm zu laden, wenn das einfacher ist.

編集する。

Ich habe CairoPlot ausprobiert:

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

Dadurch war meine CPU mehr als 10 Minuten lang auf 100 % ausgelastet und verbrauchte ständig Speicher. Ich beendete es, bevor es alle Swap verwendet. Mache ich etwas falsch oder ist CairoPlot nur gebrochen?

Weitere Bearbeitung:

Ich habe jetzt etwas mehr praktikabel mit CairoPlot, basierend lose auf dem obigen Code. Allerdings ist es nicht perfekt wegen der Auflösung: Ich benötige möglicherweise eine Auflösung von bis zu zehn Nanosekunden (1e-8), um einige der kürzeren Pulse zu erfassen. Für ein mehrsekündiges Diagramm braucht man eine sehr lange Zeit mit dieser Methode.

2voto

ubiyubix Punkte 1026

Ich habe es nicht selbst benutzt, aber vielleicht Kairo Plot ist es wert, einen Blick darauf zu werfen.

2voto

alif Punkte 619

Matplotlib könnte funktionieren. Schauen Sie sich das an Streifendiagramm-Demo .

1voto

Rodrigo Punkte 5448

Können Sie es mit CairoPlot versuchen:

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 )

Weitere Informationen finden Sie unter KairoPlan

編集する。

Ich habe Ihre Funktion fn(t) hier nicht verstanden. Die Idee von function_plot ist es, eine Funktion darzustellen, nicht einen Vektor.

Um diese Punkte darzustellen, können Sie function_plot auf diese Weise verwenden:

#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 )

Ich denke, das wird funktionieren.

Für die 100% Pinning-CPU sollte das nicht passieren... Ich werde mir das heute noch einmal ansehen. Danke für den Hinweis \o_

1voto

Daniel Woodard Punkte 83
#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

0voto

joeforker Punkte 38123

http://bitworking.org/projects/sparklines/ liefert Ihnen ein kleines Diagramm.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X