2015-08-19 10 views
6

Próbuję zrobić wizualnie atrakcyjny wykres w Pythonie. Użyłem tutaj przykładu Randala Olsona http://www.randalolson.com/2014/06/28/how-to-make-beautiful-data-visualizations-in-python-with-matplotlib/ i próbowałem wprowadzić pewne poprawki.Zmiana xlim według daty w Matplotlib

Moje dane jest prosta,

dispute_percentage 
Out[34]: 

2015-08-11 0.017647 
2015-08-12 0.004525 
2015-08-13 0.006024 
2015-08-14 0.000000 
2015-08-15 0.000000 
2015-08-17 0.000000 

Problem polega na tym, że dane rozpoczyna ładowanie w Lut 2015, i chcę, aby rozpocząć wyświetlanie w kwietniu 2015

Tu jest mój kod

from __future__ import division 
from collections import OrderedDict 
import pandas as pd 
from collections import Counter 
from pylab import * 
import datetime as datetime 
dispute_percentage.plot(kind = 'line') 
plt.xlabel('Date') 
plt.ylabel('Percent') 
plt.title('Percent Disputes In FY2015') 

# Remove the plot frame lines. They are unnecessary chartjunk.  
ax = plt.subplot(111)  
ax.spines["top"].set_visible(False)  
ax.spines["bottom"].set_visible(False)  
ax.spines["right"].set_visible(False)  
ax.spines["left"].set_visible(False) 


# Ensure that the axis ticks only show up on the bottom and left of the plot.  
# Ticks on the right and top of the plot are generally unnecessary chartjunk.  
ax.get_xaxis().tick_bottom()  
#ax.get_yaxis().tick_left()  

# Limit the range of the plot to only where the data is.  
# Avoid unnecessary whitespace. 
datenow = datetime.datetime.now 
dstart = datetime(2015,4,1) 
print datenow 
plt.ylim(0, .14)  
plt.xlim(dstart, datenow)  

Xlim jest tym, z czym walczę. Otrzymuję komunikat o błędzie:

File "C:/Mypath/name.py", line 52, in <module> 
    dstart = datetime(2015,4,1) 

TypeError: 'module' object is not callable 

Jeśli ktoś może pomóc w tym, że byłoby wspaniale. Również doceniany byłby każdy wkład w próbę uczynienia go ładniejszym.

+2

'datetime.datetime.now' nie otrzymuje c alled, tylko dostaję aliasing. Dodaj parens. Nie wywołuj też 'z importu pakietów *'. To jest paskudne. :) ** Edycja: ** i 'import datetime as datetime' jest zbędny. ** Druga edycja: ** 'dstart = ...' powinno być 'dstart = datetime.datetime (2015, 4, 1)' –

+0

@AndyKubiak Dzięki za odpowiedź. Jaki jest lepszy sposób na "z importu paczek *"? – jenryb

+2

'pakiet importu' –

Odpowiedz

5

Trzeba zadzwonić datetime.datetime.now() z nawiasami na końcu, a na dstart, trzeba użyć metody datetime modułu datetime: datetime.datetime(2015,4,1)

import datetime 

datenow = datetime.datetime.now() 
dstart = datetime.datetime(2015,4,1) 

EDIT: Aby ustawić xticks do pierwszego miesiąca (dzięki @AndyKubiak):

firsts=[] 
for i in range(dstart.month, datenow.month+1): 
    firsts.append(datetime.datetime(2015,i,1)) 
plt.xticks(firsts) 
+0

Dzięki za odpowiedź. Czy istnieje sposób, aby wymienić tylko pierwszy dzień miesiąca? Otrzymuję etykiety 08 kwietnia, 29 kwietnia, 20 maja, 1 lipca itd. – jenryb

+2

'firsts = []; dla i w zakresie (1, 13): firsts.append (datetime.datetime (2015, i, 1)) ' –

+0

@jenryb: Zobacz mnie edytuj, która używa metody z @AndyKubiak (ale ogranicza xticks do twojego' dstart 'do zakresu' datenow') – tom