2010-08-15 19 views
16

Mam zestaw danych składający się z par daty i waluty. Chcę je wykreślić na wykresie słupkowym z określonymi datami na osi X.Jak wykreślić dane w określonych datach na osi X przy użyciu matplotlib

Mój problem polega na tym, że matplotlib dystrybuuje numer xticks w całym zakresie dat; a także rysuje dane za pomocą punktów.

Daty to wszystkie obiekty datetime. Oto próbka zbiorze:

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123), 
     (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678), 
     (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987), 
     (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)] 

tutaj jest runnable przykładowy kod korzystania pyplot

import datetime as DT 
from matplotlib import pyplot as plt 

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123), 
     (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678), 
     (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987), 
     (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)] 

x = [date for (date, value) in data] 
y = [value for (date, value) in data] 

fig = plt.figure() 

graph = fig.add_subplot(111) 
graph.plot_date(x,y) 

plt.show() 

PYTANIE STRESZCZENIE:
Moja sytuacja jest bardziej podobny Mam Axes instancja gotowy (określany przez w powyższym kodzie) i chcę wykonać następujące czynności:

  1. Ustaw wartość xticks zgodnie z dokładnymi wartościami dat. Słyszałem o matplotlib.dates.DateLocator, ale nie mam pojęcia, jak utworzyć, a następnie skojarzyć go z konkretnym obiektem Axes.
  2. uzyskać ściślejszą kontrolę nad typem wykresu używanej (bar, linii, punktów, itd.)
+0

Just a wskazówka: ponieważ Twoje pytanie jest naprawdę czysto około matplotlib i nie ma nic konkretnego do wxWidgets, że to może ułatwić Jeśli zmienia twój przykład, aby użyć funkcji z 'matplotlib.pyplot' i zostawić z niego zawartość WX. –

+0

@David: Naprawiono. Dzięki, zdałem sobie sprawę, że może być więcej ludzi, którzy potrafią przeczytać 'matplotlib' +' pyplot' lepiej niż 'matplotlib' +' wx' – Kit

Odpowiedz

28

Co robisz jest na tyle prosty, że najłatwiej po prostu za pomocą wykresu, zamiast plot_date. fab_date sprawdza się doskonale w przypadku bardziej skomplikowanych przypadków, ale konfigurowanie tego, czego potrzebujesz, może być łatwo zrealizowane bez tego.

np Bazując na powyższym przykładzie:

import datetime as DT 
from matplotlib import pyplot as plt 
from matplotlib.dates import date2num 

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123), 
     (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678), 
     (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987), 
     (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)] 

x = [date2num(date) for (date, value) in data] 
y = [value for (date, value) in data] 

fig = plt.figure() 

graph = fig.add_subplot(111) 

# Plot the data as a red line with round markers 
graph.plot(x,y,'r-o') 

# Set the xtick locations to correspond to just the dates you entered. 
graph.set_xticks(x) 

# Set the xtick labels to correspond to just the dates you entered. 
graph.set_xticklabels(
     [date.strftime("%Y-%m-%d") for (date, value) in data] 
     ) 

plt.show() 

Jeśli wolisz bar wykres, wystarczy użyć plt.bar(). Aby zrozumieć, w jaki sposób ustawić style linii i marker, zobacz plt.plot() Plot with date labels at marker locations http://www.geology.wisc.edu/~jkington/matplotlib_date_labels.png

+0

+1 To jest doskonałe. Dziękuję Ci! – Kit

Powiązane problemy