2012-01-19 15 views
24

To powinno być łatwe, ale dopiero co zacząłem bawić się z matplotlib i pytonem. Mogę wykonać linię lub działkę rozproszoną, ale nie jestem pewien, jak wykonać prostą funkcję krokową. Każda pomoc jest doceniana.Jak wykreślić funkcję kroku z Matplotlib w Pythonie?

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

Co masz na myśli przez funkcję krok? Jak histogram? – wim

+0

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

Odpowiedz

39

Wygląda na to, że chcesz 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

Dzięki! To działa. Jakikolwiek sposób na pozbycie się pionowych linii? – rhm2012

+3

Cóż, jeśli nie chcesz żadnych pionowych linii, spójrz na 'plt.hlines'. Na przykład. 'plt.hlines (y, range (1,5), range (2,6))' –

+2

@Joe Kington: Przepraszam za komentarz z roku na rok. Jestem trochę zdezorientowany. Czy wykres nie powinien pokazywać 0.0028 między 1 a 2, a następnie skakać do 0,051 przy 2 i tak dalej? Wygląda na to, że krok używa następnej wartości wzdłuż. (Myślę o kroku timeseries, gdzie wartość jest w t0 i pozostaje aż do t1, gdy zmienia się na b i tak dalej.) Czy istnieje sposób, aby krok() zachowywał się w ten sposób. –

1

Wystarczy narysować dwie linie, jedna przy y = 0, a jeden na y = 1, odcinając na cokolwiek x czynność krok jest?

np. jeśli chcesz krok od 0 do 1 w x=2.3 i działki od x=0 do 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

myślę chcesz pylab.bar(x,y,width=1) lub równie pyplot jest metoda bar. jeśli nie kasy gallery dla wielu stylów działek, które możesz zrobić. Każdy obraz pochodzi z przykładowym kodem pokazującym, jak zrobić to przy użyciu matplotlib.

11

Jeśli masz nierównomiernie rozmieszczone punkty danych, można użyć argumentu drawstyle kluczowe dla plot:

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

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

Dostępne są również steps-mid i steps-post.

+0

Świetnie. Użyłem tego do czegoś innego. Prosty i precyzyjny. – Jerry

+0

[link do dokumentacji "drawstyle"] (http://matplotlib.org/api/lines_api.html#matplotlib.lines.Line2D.set_drawstyle). _ "Kroki" są równoważne "steps-pre" i są utrzymywane z zachowaniem kompatybilności wstecznej. "_ –

+1

@VanniTotaro Thanks; Zaktualizowałem odpowiedź. –

0

W przypadku gdy ktoś chce tylko stepify niektóre dane zamiast rzeczywiście wykreślić go:

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

Szukałem bez powodzenia wbudowanej funkcji. Dzięki! Miałem problem (z powodu wersji?): TypeError: obiekt "zip" nie jest indeksowalny. Używam Pythona 3.5. Funkcja działa po zmianie całego pliku ZIP (zip (...)). – Daniel

+0

@daniel Dzięki za zwrócenie na to uwagi! Napisałem kod dla Pythona 2, co wyjaśnia błąd. –

Powiązane problemy