2012-01-19 12 views
24

Questo dovrebbe essere facile ma ho appena iniziato a giocare con matplotlib e python. Posso fare una linea o un grafico a dispersione ma non sono sicuro di come fare una semplice funzione di passaggio. Ogni aiuto è molto apprezzato.Come faccio a tracciare una funzione di passo con Matplotlib in Python?

x = 1,2,3,4 
y = 0.002871972681775004, 0.00514787917410944, 0.00863476098280219, 0.012003316194034325 
+0

Cosa vuoi dire da una funzione di passo? Come un istogramma? – wim

+0

@wim https://en.wikipedia.org/wiki/Step_function – Galen

risposta

39

Sembra che tu voglia step.

E.g.

import matplotlib.pyplot as plt 

x = [1,2,3,4] 
y = [0.002871972681775004, 0.00514787917410944, 
    0.00863476098280219, 0.012003316194034325] 

plt.step(x, y) 
plt.show() 

enter image description here

+0

Grazie! Funziona. Un modo per sbarazzarsi delle linee verticali? – rhm2012

+3

Bene, se non vuoi linee verticali, dai un'occhiata a 'plt.hlines'. Per esempio. 'plt.hlines (y, range (1,5), range (2,6))' –

+2

@Joe Kington: Ci scusiamo per il commento dell'anno successivo. Sono un po 'confuso da questo. Non dovrebbe il grafico mostrare 0.0028 tra 1 e 2 e poi saltare a 0.051 a 2, e così via? Sembra che il passo usi il valore successivo. (Sto pensando a un passaggio di timeseries, dove il valore è a at0 e rimane un fino a t1 quando cambia in b e così via.) C'è un modo per fare in modo che step() si comporti in questo modo. –

1

solo disegnare due linee, una a y = 0, e uno a Y = 1, tagliando a qualunque x la funzione passo è per?

ad es. se si vuole fare un passo 0-1 a x=2.3 e la trama x=0-x=5:

import matplotlib.pyplot as plt 
#         _ 
# if you want the vertical line _| 
plt.plot([0,2.3,2.3,5],[0,0,1,1]) 
# 
# OR: 
#          _ 
# if you don't want the vertical line _ 
#plt.plot([0,2.3],[0,0],[2.3,5],[1,1]) 

# now change the y axis so we can actually see the line 
plt.ylim(-0.1,1.1) 

plt.show() 
1

Penso che si desidera pylab.bar(x,y,width=1) o altrettanto pyplot 's metodo bar. se non si verifica il gallery per i molti stili di trama che si possono fare. Ogni immagine viene fornita con un codice di esempio che mostra come realizzarlo usando matplotlib.

11

Se si dispone in modo non uniforme punti dati distanziati, è possibile utilizzare l'argomento drawstyle parola chiave per plot:

x = [1,2.5,3.5,4] 
y = [0.002871972681775004, 0.00514787917410944, 
    0.00863476098280219, 0.012003316194034325] 

plt.plot(x, y, drawstyle='steps-pre') 

sono disponibili anche steps-mid e steps-post.

+0

Grande. L'ho usato per qualcos'altro. Semplice e preciso. – Jerry

+0

[link di documentazione '' drawstyle'] (http://matplotlib.org/api/lines_api.html#matplotlib.lines.Line2D.set_drawstyle). _ "'Steps' è equivalente a 'steps-pre' e viene mantenuto per compatibilità con le versioni precedenti." _ –

+1

@VanniTotaro Grazie; Ho aggiornato la risposta. –

0

Nel caso in cui qualcuno vuole solo stepify alcuni dati piuttosto che in realtà tracciarla:

def get_x_y_steps(x, y, where="post"): 
    if where == "post": 
     x_step = [x[0]] + [_x for tup in zip(x, x)[1:] for _x in tup] 
     y_step = [_y for tup in zip(y, y)[:-1] for _y in tup] + [y[-1]] 
    elif where == "pre": 
     x_step = [_x for tup in zip(x, x)[:-1] for _x in tup] + [x[-1]] 
     y_step = [y[0]] + [_y for tup in zip(y, y)[1:] for _y in tup] 
    return x_step, y_step 
+0

Hanno cercato senza successo una funzione integrata. Grazie! Ho avuto un problema (a causa della versione?): TypeError: l'oggetto 'zip' non è subscriptable. Sto usando Python 3.5. La funzione funziona dopo aver modificato tutto l'elenco zip (zip (...)). – Daniel

+0

@daniel Grazie per averlo notato! Ho scritto il codice per Python 2, in modo che spieghi l'errore. –

Problemi correlati