2012-06-14 17 views
6

、BDATEとEDATEの両方datetime.datetimeの()オブジェクトである:barh()でxaxis_date()を使用するにはどうすればよいですか?以下のコードで

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

これは(dates.py._to_ordinalfに方法ダウンはAttributeErrorをスロー):

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'

私私がxaxisでdatetimesをちょうど押して、それを持っていればそれが素晴らしいと思った は細部を解決する;そうではありません。どのように日付をxaxisに同意できるかについての提案はありますか?

答えて

11

何が起こっているかは、matplotlibが実際にプロットするためにdatetimeオブジェクトを使用していないことです。

日付は、まず内部浮動小数点形式に変換されます。変換はタイムデルタを処理するように設定されていません(間違いなく監督です)。

基本的には基本的に正確に行うことができますが、最初に日付をmatplotlibの内部形式に明示的に変換してからax.xaxis_date()を呼び出すだけです。簡単な例として、

(これのほとんどは、プロットするデータを生成している...):

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

関連する問題