Tworzenie wykresu z datą i czasem w etykietach osi za pomocą matplotlib

Mam swoje dane w tablicy o następującej strukturze,

[[1293606162197, 0, 0],
 [1293605477994, 63, 0],
 [1293605478057, 0, 0],
 [1293605478072, 2735, 1249],
 [1293606162213, 0, 0],
 [1293606162229, 0, 0]]

Pierwsza kolumna to czas epoki( w ms), druga to y1, a trzecia to y2. Potrzebuję wykresu z czasem na osi x oraz y1 i y2 na lewej i prawej osi Y.

Przeglądałem dokumentację, ale nie mogłem znaleźć sposobu, aby moje tyknięcia osi x wyświetlały zarówno datę, jak i czas ,np. "28/12 16:48", tj. "Data/MIESIĄC GODZINA:min". Cała dokumentacja pomaga mi w wyświetlaniu dat sama, ale nie tego chcę. Każda pomoc będzie w tym mile widziana.

I, jeśli może się wydawać, że to nie jest praca domowa. W rzeczywistości jest to kontynuacja mojego poprzedniego pytania, Odczyt i wykresy danych odczytywanych z ogromnych plików.

Author: Community, 2011-03-31

1 answers

Mam nadzieję, że to pomoże. Zawsze miałem problemy z randkami matplotliba. Matplotlib wymaga formatu float , który jest liczony w dniach od epoki. Funkcje pomocnicze num2date i {[2] } wraz z wbudowanym Pythonem datetime mogą być używane do konwersji do / Z. Formatowanie zostało usunięte z tego przykładu . Oś na dowolnym wykresie można zmienić na oś daty za pomocą set_major_formatter.

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import dates
import datetime

a = np.array([
    [1293605162197, 0, 0],
    [1293605477994, 63, 0],
    [1293605478057, 0, 0],
    [1293605478072, 2735, 1249],
    [1293606162213, 0, 0],
    [1293606162229, 0, 0]])

d = a[:,0]
y1 = a[:,1]
y2 = a[:,2]

# convert epoch to matplotlib float format
s = d/1000
ms = d-1000*s  # not needed?
dts = map(datetime.datetime.fromtimestamp, s)
fds = dates.date2num(dts) # converted

# matplotlib date format object
hfmt = dates.DateFormatter('%m/%d %H:%M')

fig = plt.figure()
ax = fig.add_subplot(111)
ax.vlines(fds, y2, y1)

ax.xaxis.set_major_locator(dates.MinuteLocator())
ax.xaxis.set_major_formatter(hfmt)
ax.set_ylim(bottom = 0)
plt.xticks(rotation='vertical')
plt.subplots_adjust(bottom=.3)
plt.show()

wynik

 42
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-02 13:12:05