2009-10-15 14 views
88

Mam tablicę znaczników czasu w formacie (HH: MM: SS.mmmmmm) i inną tablicę liczb zmiennoprzecinkowych, z których każdy odpowiada wartości w tablicy sygnatury czasowej.Czas wydruku w języku Python z Matplotlibem

Czy można wydrukować czas na osi X i liczby na osi Y za pomocą Matplotlib?

Próbowałem, ale jakoś akceptowałem tylko tablice pływaków. Jak mogę to zrobić, aby zaplanować czas? Czy muszę w jakikolwiek sposób modyfikować format?

Odpowiedz

107

Musisz najpierw przekonwertować znaczniki czasu na obiekty Python datetime (użyj datetime.strptime). Następnie użyj date2num, aby przekonwertować daty na format matplotlib.

wykreślić daty i wartości wykorzystujące plot_date:

dates = matplotlib.dates.date2num(list_of_datetimes) 
matplotlib.pyplot.plot_date(dates, values) 
+1

czy wydrukuje datę lub godzinę? Chcę tylko czas od konwersji na datetime, rok jest ustawiony na 1990. – randomThought

+0

"... na konwersję na datetime, rok jest ustawiony na 1990": Czy mógłbyś wysłać kod, którego używasz do konwersji z ciągu na datetime ? Coś może być nie tak z konwersją. Re. formatowanie etykiet wykresów, patrz link date_demo1 dostarczony przez J. K. Seppänen. Dokumentacja biblioteki matplot jest doskonała, BTW. http://matplotlib.sourceforge.net/index.html – codeape

+11

data_plach -> matplotlib.pyplot.plot_date (daty, wartości) – Pete

52

Można również działka datownik, pary wartość za pomocą pyplot.plot (po analizowania ich z reprezentacją łańcuchach). (Sprawdzona z wersji matplotlib 1.2.0 i 1.3.1).

przykład:

import datetime 
import random 
import matplotlib.pyplot as plt 

# make up some data 
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)] 
y = [i+random.gauss(0,1) for i,_ in enumerate(x)] 

# plot 
plt.plot(x,y) 
# beautify the x-labels 
plt.gcf().autofmt_xdate() 

plt.show() 

obraz wynikowy:

Line Plot


tu jest taki sam jak wykres punktowy:

import datetime 
import random 
import matplotlib.pyplot as plt 

# make up some data 
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)] 
y = [i+random.gauss(0,1) for i,_ in enumerate(x)] 

# plot 
plt.scatter(x,y) 
# beautify the x-labels 
plt.gcf().autofmt_xdate() 

plt.show() 

Tworzy obraz podobny do tego:

Scatter Plot

+2

jak to działa na działkę rozproszoną? – andi

+4

@i powinien działać tak, jak w moim przykładzie (zmień 'plot' na' scatter'). – moooeeeep

+1

Nie rozumiem, dlaczego jest to piąte pytanie, na które natknąłem się, gdzie nikt faktycznie nie * WYPRZEDZAŁ * przy użyciu wykresu punktowego - to nie działa. 'Błąd typu - niepoprawna promocja typu'. – dwanderson

2

7 lat później i ten kod pomógł mi. Jednak moje czasy wciąż nie były wyświetlane poprawnie.

enter image description here

Korzystanie matplotlib 2.0.0 i musiałem dodać następujący fragment kodu z Editing the date formatting of x-axis tick labels in matplotlib Paul H.

import matplotlib.dates as mdates 
myFmt = mdates.DateFormatter('%d') 
ax.xaxis.set_major_formatter(myFmt) 

zmieniłem format na (% H:% M) i czas wyświetlany poprawnie. enter image description here

Wszystko dzięki społeczności.

1

Miałem problemy z tym przy użyciu wersji matplotlib: 2.0.2. Uruchamiając powyższy przykład, mam wyśrodkowany zestaw baniek.

graph with centered stack of bubbles

I "stałe" problem dodając kolejną linię:

plt.plot([],[]) 

Cały fragment kodu staje:

import datetime 
import random 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 


# make up some data 
x = [datetime.datetime.now() + datetime.timedelta(minutes=i) for i in range(12)] 
y = [i+random.gauss(0,1) for i,_ in enumerate(x)] 

# plot 
plt.plot([],[]) 
plt.scatter(x,y) 

# beautify the x-labels 
plt.gcf().autofmt_xdate() 
myFmt = mdates.DateFormatter('%H:%M') 
plt.gca().xaxis.set_major_formatter(myFmt) 

plt.show() 
plt.close() 

To daje obraz z pęcherzyków rozmieszczonych zgodnie z zapotrzebowaniem .

graph with bubbles distributed over time

+0

Dziękujemy za zaktualizowaną wersję. – Aventinus