2012-06-14 16 views
6

in dem folgenden Code, bdate und EDATE sind beide datetime.datetime() Objekte:Wie kann ich xaxis_date() mit barh() verwenden?

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

aber dies löst ein Attribut Weg nach unten 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 dachte, es wäre toll, wenn ich einfach mal bei Xaxis shocken könnte und es die Details ausarbeiten lassen; nicht so viel. irgendwelche Vorschläge, wie man Daten zu Xaxis agreable macht?

Antwort

11

Was passiert, ist, dass Matplotlib nicht tatsächlich datetime Objekte zum Plotten verwendet.

Daten werden zuerst in ein internes Gleitkommaformat konvertiert. Die Konvertierung ist nicht auf die Verarbeitung von Zeitdauern ausgelegt (was wohl ein Versehen ist).

Sie können im Grunde tun genau das, was Sie wollten, müssen Sie nur die Daten in das interne Format von Matplotlib zuerst konvertieren, und rufen Sie dann ax.xaxis_date().

Als kleines Beispiel (Die meisten dieser wird Daten erzeugt plotten ...):

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

Verwandte Themen