So the situation is like this. Suppose we have:
class Test(datetime):
def a(self):
return '{0:02d}{1:02d}{2:02d}{3:02d}'.format(self.year % 100, self.month, self.day, self.hour)
x = [Test(2010, 05, 02, 06), Test(2010, 05, 02, 12)]
y = [0, 1]
Now trying to use:
import matplotlib.pyplot as plt
plt.plot(x, y)
gives a blank graph and the following error:
/usr/local/lib/python2.7/dist-packages/matplotlib/pyplot.py in plot(*args, **kwargs)
2456 ax.hold(hold)
2457 try:
-> 2458 ret = ax.plot(*args, **kwargs)
2459 draw_if_interactive()
2460 finally:
/usr/local/lib/python2.7/dist-packages/matplotlib/axes.pyc in plot(self, *args, **kwargs)
3847
3848 for line in self._get_lines(*args, **kwargs):
-> 3849 self.add_line(line)
3850 lines.append(line)
3851
/usr/local/lib/python2.7/dist-packages/matplotlib/axes.pyc in add_line(self, line)
1441 line.set_clip_path(self.patch)
1442
-> 1443 self._update_line_limits(line)
1444 if not line.get_label():
1445 line.set_label('_line%d'%len(self.lines))
/usr/local/lib/python2.7/dist-packages/matplotlib/axes.pyc in _update_line_limits(self, line)
1449
1450 def _update_line_limits(self, line):
-> 1451 p = line.get_path()
1452 if p.vertices.size > 0:
1453 self.dataLim.update_from_path(p, self.ignore_existing_data_limits,
/usr/local/lib/python2.7/dist-packages/matplotlib/lines.pyc in get_path(self)
642 """
643 if self._invalidy or self._invalidx:
--> 644 self.recache()
645 return self._path
646
/usr/local/lib/python2.7/dist-packages/matplotlib/lines.pyc in recache(self, always)
390 x = ma.asarray(xconv, np.float_)
391 else:
--> 392 x = np.asarray(xconv, np.float_)
393 x = x.ravel()
394 else:
/usr/local/lib/python2.7/dist-packages/numpy/core/numeric.pyc in asarray(a, dtype, order)
233
234 """
--> 235 return array(a, dtype, copy=False, order=order)
236
237 def asanyarray(a, dtype=None, order=None):
TypeError: float() argument must be a string or a number
Do any of you know what’s going on? And yes, I know there is a date2num that I could use on x, but I’d like to understand the reason for the error here if it’s possible.
Matplotlib uses the
__class__attribute of an object to determine how to handle it. YourTestclass isn’t the same as thedatetimeclass:So matplotlib doesn’t recognise your
Testclass as adatetime.Here’s an ugly hack that works around the problem by registering the
Testclass so that its handled the same way adatetimeis. Check out thematplotlib.unitsdocumentation for more information. This code is not guaranteed to work with future versions of matplotlib:(I tested this using python 2.7.2 with matplotlib 1.1.0 on Windows)