How can I use xaxis_date () with barh ()?

in the code below, bdate and edate are datetime.datetime () objects:

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

but this throws the AttributeError path down in date.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, at line 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, sel f) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dates.py", line 1125, in the envelope return date2num (value) File "/ Library / Frameworks /Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dates.py ", line 260, at 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: object 'datetime.timedelta' does not have attribute 'toordinal'

I thought it would be great if I could just go in cycles in xaxis and have it detail details; not so much. any suggestions on how to make dates capable of xaxis?

+6
source share
1 answer

What happens is that matplotlib does not actually use datetime objects to build.

Dates are first converted to internal floating point format. The conversion is not configured to handle timedeltas (which may be oversight).

Basically you can do exactly what you wanted, you just need to explicitly convert the dates to the matplotlib internal format, and then call ax.xaxis_date() .

As a quick example (most of this is generating data to build ...):

 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 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

+12
source

Source: https://habr.com/ru/post/918136/


All Articles