in the code below, bdate and edate are both datetime.datetime() objects:
pylab.barh(ypos, edate - bdate, left=bdate, height=TRMWidth )
but this throws an AttributeError way down in 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 thought it’d be great if i could just shove datetimes at xaxis and have it
work out the details; not so much. any suggestions as to how to make dates agreaable to xaxis?
What’s happening is that matplotlib doesn’t actually use datetime objects for plotting.
Dates are first converted into an internal floating point format. The conversion isn’t set up to handle timedeltas (which is arguably an oversight).
You can basically do exactly what you wanted, you just need to explictly convert the dates to matplotlib’s internal format first, and then call
ax.xaxis_date().As a quick example (Most of this is generating data to plot…):