2012-01-19 17 views
24

Esto debería ser fácil pero acabo de empezar a jugar con matplotlib y python. Puedo hacer una línea o un diagrama de dispersión, pero no estoy seguro de cómo hacer una función de paso simple. Cualquier ayuda es muy apreciada.¿Cómo grafico de una función de paso con Matplotlib en Python?

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

¿Qué quiere decir por una función de paso? Como un histograma? – wim

+0

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

Respuesta

39

Parece que quiere 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

¡Gracias! Funciona. ¿Alguna forma de deshacerse de las líneas verticales? – rhm2012

+3

Bueno, si no quiere ninguna línea vertical, eche un vistazo a 'plt.hlines'. P.ej. 'plt.hlines (y, range (1,5), range (2,6))' –

+2

@Joe Kington: Perdón por el comentario del año posterior. Estoy un poco confundido por esto. ¿No debería el gráfico mostrar 0.0028 entre 1 y 2 y luego saltar a 0.051 en 2, y así sucesivamente? Parece que el paso usa el siguiente valor. (Estoy pensando en un paso de series temporales, donde el valor es a t0 y sigue siendo un hasta t1 cuando cambia a b y así sucesivamente). ¿Hay alguna manera de hacer que step() se comporte de esta manera? –

1

Sólo señalar dos líneas, una en y = 0, y uno en y = 1, cortando a lo x su función escalón es para?

p. Ej. si quieres pasar de 0 a 1 en x=2.3 y 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

Creo que quieres pylab.bar(x,y,width=1) o igualmente pyplot 's método de barras. si no, comprueba el gallery para ver los muchos estilos de tramas que puedes hacer. Cada imagen viene con un código de ejemplo que le muestra cómo hacerlo usando matplotlib.

11

Si usted tiene no uniformemente espaciados puntos de datos, puede utilizar el argumento de palabra clave para drawstyleplot:

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

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

También están disponibles steps-mid y steps-post.

+0

Genial. Lo usé para otra cosa. Simple y preciso. – Jerry

+0

[enlace de documentación '' drawstyle'] (http://matplotlib.org/api/lines_api.html#matplotlib.lines.Line2D.set_drawstyle). _ "'Pasos' es equivalente a 'steps-pre' y se mantiene para compatibilidad con versiones anteriores." _ –

+1

@VanniTotaro Gracias; He actualizado la respuesta. –

0

En caso de que alguien sólo quiere stepify algunos datos en lugar de realmente representar gráficamente que:

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

Han estado buscando sin éxito una función incorporada. ¡Gracias! Tuve un problema (debido a la versión?): TypeError: el objeto 'zip' no es subscriptible. Estoy usando Python 3.5. La función funciona después de que cambie todo el zip por list (zip (...)). – Daniel

+0

@daniel ¡Gracias por notar eso! Escribí el código para python 2, así que eso explica el error. –

Cuestiones relacionadas