Wykreślanie czasu w Pythonie za pomocą Matplotlib


164

Mam tablicę znaczników czasu w formacie (HH: MM: SS.mmmmmm) i inną tablicę liczb zmiennoprzecinkowych, z których każda odpowiada wartości w tablicy sygnatur czasowych.

Czy mogę wykreślić czas na osi X i liczby na osi Y za pomocą Matplotlib?

Próbowałem, ale w jakiś sposób akceptowałem tylko tablice pływaków. Jak mogę zmusić go do wyznaczania czasu? Czy muszę w jakikolwiek sposób modyfikować format?

Odpowiedzi:


178

Najpierw musisz przekonwertować swoje znaczniki czasu na datetimeobiekty Pythona (użyj datetime.strptime). Następnie użyj, date2numaby przekonwertować daty do formatu matplotlib.

Wykreśl daty i wartości za pomocą plot_date:

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

3
czy wykreśli datę, czy tylko godzinę? Chcę tylko
podać

„... po konwersji na datę / godzinę, rok jest ustawiony na 1990”: Czy możesz opublikować kod, którego używasz do konwersji z ciągu znaków na datę / godzinę? Coś może być nie tak z konwersją. Re. formatowanie etykiet wykresów, patrz link date_demo1 dostarczony przez JK Seppänena. Przy okazji, dokumentacja biblioteki matplot jest doskonała. matplotlib.sourceforge.net/index.html
codeape

14
plot_dates -> matplotlib.pyplot.plot_date (daty, wartości)
Pete

3
A co z wykresem punktowym? Chcę podać tablicę rozmiarów, aby określić rozmiar bąbelków rozproszonych, ale nie ma odpowiednika scatter_date()ani oczywistego / bezpośredniego sposobu uzyskania tego wykresu.
dwanderson

4
Powyższe zwraca listę z jednym obiektem typu: matplotlib.lines.Line2D object. Jak mam tego użyć, aby wyświetlić wykres?
Arindam Roychowdhury

87

Możesz także wykreślić znacznik czasu, pary wartości za pomocą pyplot.plot (po przeanalizowaniu ich z ich reprezentacji w postaci ciągu). (Testowane z wersjami 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()

Wynikowy obraz:

Działka liniowa


Oto to samo, co 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:

Wykres punktowy


4
@andi powinno działać tak jak w moim przykładzie (zmień plotna scatter).
moooeeeep

1
Nie rozumiem, dlaczego jest to piąte pytanie, na które się natknąłem, gdzie nikt tak naprawdę NIE PRÓBOWAŁ używając wykresu punktowego - to nie działa. Type Error - invalid type promotion.
dwanderson

1
@dwanderson Może więc robisz coś nie tak. Dodałem przykład dla wykresu punktowego z datetime.datetimeobiektami na osi x do mojego postu.
moooeeeep

Do siatki dodajplt.grid(True)
Christophe Roussy

1
@AimForClarity Działa dla mnie z matplotlib.__version__2.2.2. Wykres punktowy ma jednak domyślnie ustawione zbyt szerokie limity x. Ta odpowiedź wydaje się zapewniać obejście inne niż ręczne dostosowywanie plt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep

23

7 lat później ten kod mi pomógł. Jednak moje czasy nadal nie wyświetlały się poprawnie.

wprowadź opis obrazu tutaj

Używając Matplotlib 2.0.0 i musiałem dodać następujący fragment kodu z Edycja formatowania daty etykiet znaczników osi x w matplotlib autorstwa Paula 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świetlał się poprawnie. wprowadź opis obrazu tutaj

Wszystko dzięki społeczności.


16

Miałem z tym problem używając matplotlib w wersji: 2.0.2. Uruchamiając przykład z góry, otrzymałem wyśrodkowany zestaw bąbelków.

wykres z wyśrodkowanym stosem bąbelków

„Naprawiłem” problem, dodając kolejną linię:

plt.plot([],[])

Cały fragment kodu staje się:

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

Tworzy to obraz z bąbelkami rozmieszczonymi zgodnie z potrzebami.

wykres z bąbelkami rozłożonymi w czasie


Nie działa dla mnie na py2.6. Otrzymuję ValueError: minimalny limit widoku -0.05500000000000001 jest mniejszy niż 1 i jest nieprawidłową wartością daty Matplotlib. Dzieje się tak często, jeśli przekażesz wartość inną niż data-godzina do osi, która ma jednostki daty i godziny <Rozmiar rysunku 432 x 288 z 1
osiami

Rozwiązaniem dziwnych x-limów jest ustawienie ich samodzielnie: stackoverflow.com/questions/21423158/…
Qaswed
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.