2012-06-14 11 views
6

w poniższej kodu bdate i EDATE oba datetime.datetime() obiektów:Jak mogę użyć xaxis_date() z barh()?

pylab.barh(ypos, edate - bdate, left=bdate, height=TRMWidth) 

ale generuje AttributeError sposób w dates.py._to_ordinalf():

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/pyplot.py", line 1926, in barh ret = ax.barh(bottom, width, height, left, **kwargs) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes.py", line 4774, in barh orientation='horizontal', **kwargs) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes.py", line 4624, in bar width = self.convert_xunits(width) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/artist.py", line 147, in convert_xunits return ax.xaxis.convert_units(x) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axis.py", line 1312, in convert_units ret = self.converter.convert(x, self.units, self) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dates.py", line 1125, in convert return date2num(value) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dates.py", line 260, in date2num else: return np.asarray([_to_ordinalf(val) for val in d]) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dates.py", line 189, in _to_ordinalf base = float(dt.toordinal())

AttributeError: 'datetime.timedelta' object has no attribute 'toordinal'

I pomyślałbym, że byłoby wspaniale, gdybym po prostu pchał datetimes na xaxis i kazałbym to ustalić szczegóły; nie tak bardzo. wszelkie sugestie dotyczące tego, w jaki sposób sprawić, by daty były podatne na Xaxis?

Odpowiedz

11

Co się dzieje, że matplotlib nie używa obiektów do datowania do drukowania.

Daty są najpierw konwertowane na wewnętrzny format zmiennoprzecinkowy. Konwersja nie jest skonfigurowana do obsługi timedeltas (co jest prawdopodobnie niedopatrzeniem).

Zasadniczo możesz zrobić dokładnie to, co chciałeś, wystarczy najpierw przekonwertować daty na format wewnętrzny matplotlib, a następnie zadzwonić pod numer ax.xaxis_date().

Jako prosty przykład (większość to generowanie danych do działki ...):

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

def drange(start, end, interval=dt.timedelta(days=1)): 
    output = [] 
    while start <= end: 
     output.append(start) 
     start += interval 
    return output 

# Generate a series of dates for plotting... 
edate = drange(dt.datetime(2012, 2, 1), dt.datetime(2012, 6, 15), 
         dt.timedelta(days=5)) 
bdate = drange(dt.datetime(2012, 1, 1), dt.datetime(2012, 5, 15), 
         dt.timedelta(days=5)) 

# Now convert them to matplotlib's internal format... 
edate, bdate = [mdates.date2num(item) for item in (edate, bdate)] 

ypos = range(len(edate)) 
fig, ax = plt.subplots() 

# Plot the data 
ax.barh(ypos, edate - bdate, left=bdate, height=0.8, align='center') 
ax.axis('tight') 

# We need to tell matplotlib that these are dates... 
ax.xaxis_date() 

plt.show() 

enter image description here

Powiązane problemy