Hi,

on the following test case:

import numpy
import pylab
from matplotlib.dates import DateFormatter, HourLocator, MinuteLocator

fig = pylab.figure()
ax = fig.add_subplot(1,1,1)

tics = numpy.linspace(1.3,1.6,4)
for tic in tics:
     t = numpy.linspace(tic, tic+0.01, 100)
     ax.plot(t, numpy.random.randn(len(t)), 'b.')

ax.xaxis.set_major_formatter(DateFormatter("%H:%M"))
ax.xaxis.set_major_locator(HourLocator(interval=2))
ax.xaxis.set_minor_locator(MinuteLocator(interval=30))

pylab.show()

I got an OverflowError:

Traceback (most recent call last):
   File 
"/usr/lib/python2.4/site-packages/matplotlib/backends/backend_gtk.py", 
line 284, in expose_event
     self._render_figure(self._pixmap, w, h)
   File 
"/usr/lib/python2.4/site-packages/matplotlib/backends/backend_gtkagg.py", 
line 73, in _render_figure
     FigureCanvasAgg.draw(self)
   File 
"/usr/lib/python2.4/site-packages/matplotlib/backends/backend_agg.py", 
line 392, in draw
     self.figure.draw(renderer)
   File "/usr/lib/python2.4/site-packages/matplotlib/figure.py", line 
544, in draw
     for a in self.axes: a.draw(renderer)
   File "/usr/lib/python2.4/site-packages/matplotlib/axes.py", line 
1063, in draw    a.draw(renderer)
   File "/usr/lib/python2.4/site-packages/matplotlib/axis.py", line 545, 
in draw
     majorTicks = self.get_major_ticks()
   File "/usr/lib/python2.4/site-packages/matplotlib/axis.py", line 683, 
in get_major_ticks
     numticks = len(self.major.locator())
   File "/usr/lib/python2.4/site-packages/matplotlib/dates.py", line 
450, in __call__
     self.rule.set(dtstart=dmin-delta, until=dmax+delta)
   File "/usr/lib/python2.4/site-packages/dateutil/relativedelta.py", 
line 289, in __rsub__
     return self.__neg__().__radd__(other)
   File "/usr/lib/python2.4/site-packages/dateutil/relativedelta.py", 
line 276, in __radd__
     microseconds=self.microseconds))
OverflowError: date value out of range

Note that if everything works properly if:
* I start tics at 1.4 instead of 1.3
* *or* I remove calls to set_major_locator and set_minor_locator

Now, if I set tics=numpy.linspace(1.4,2.6,4), I got the following error:

Traceback (most recent call last):
   File 
"/usr/lib/python2.4/site-packages/matplotlib/backends/backend_gtk.py", 
line 284, in expose_event
     self._render_figure(self._pixmap, w, h)
   File 
"/usr/lib/python2.4/site-packages/matplotlib/backends/backend_gtkagg.py", 
line 73, in _render_figure
     FigureCanvasAgg.draw(self)
   File 
"/usr/lib/python2.4/site-packages/matplotlib/backends/backend_agg.py", 
line 392, in draw
     self.figure.draw(renderer)
   File "/usr/lib/python2.4/site-packages/matplotlib/figure.py", line 
544, in draw
     for a in self.axes: a.draw(renderer)
   File "/usr/lib/python2.4/site-packages/matplotlib/axes.py", line 
1063, in draw    a.draw(renderer)
   File "/usr/lib/python2.4/site-packages/matplotlib/axis.py", line 545, 
in draw
     majorTicks = self.get_major_ticks()
   File "/usr/lib/python2.4/site-packages/matplotlib/axis.py", line 683, 
in get_major_ticks
     numticks = len(self.major.locator())
   File "/usr/lib/python2.4/site-packages/matplotlib/dates.py", line 
450, in __call__
     self.rule.set(dtstart=dmin-delta, until=dmax+delta)
   File "/usr/lib/python2.4/site-packages/matplotlib/dates.py", line 
391, in set
     self._rrule = rrule(**self._construct)
   File "/usr/lib/python2.4/site-packages/dateutil/rrule.py", line 238, 
in __init__
     dtstart = dtstart.replace(microsecond=0)
ValueError: month must be in 1..12

except if once again, I remove calls to set_major_locator and 
set_minor_locator... (I definitely dont understand this last error about 
an invalid month, since I thought times were supposedly in days since 
0001-01-01 00:00:00 UTC.)

Last thing, is there any reason why t=0 is an invalid number of days? Eg.

In [4]: num2date(0)

/usr/lib/python2.4/site-packages/matplotlib/dates.py in num2date(x, tz)
     213     """
     214     if tz is None: tz = _get_rc_timezone()
--> 215     if not iterable(x): return _from_ordinalf(x, tz)
     216     else: return [_from_ordinalf(val, tz) for val in x]
     217

/usr/lib/python2.4/site-packages/matplotlib/dates.py in 
_from_ordinalf(x, tz)
     152     if tz is None: tz = _get_rc_timezone()
     153     ix = int(x)
--> 154     dt = datetime.datetime.fromordinal(ix)
     155     remainder = float(x) - ix
     156     hour, remainder = divmod(24*remainder, 1)

ValueError: ordinal must be >= 1

First valid date number is indeed 1, but this corresponds to 0001-01-01 
00:00:00 UTC:

In [10]: num2date(1).isoformat()
Out[10]: '0001-01-01T00:00:00+00:00'

and not to 0001-01-02. I suspect the documentation for num2date is 
therefore not accurate... or is it just that I missed something?

Cheers.
-- 
    .~.   Yannick COPIN  (o:>*  Doctus cum libro
    /V\   ---===<<<### NOT IN THE OFFICE ###>>>===---
   // \\  Institut de physique nucleaire de Lyon (IN2P3 - France)
  /(   )\ http://snovae.in2p3.fr/ycopin/
   ^`~'^

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to