Revision: 7661
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7661&view=rev
Author:   jdh2358
Date:     2009-09-06 21:16:27 +0000 (Sun, 06 Sep 2009)

Log Message:
-----------
fix to empty datetime bug; add datetime tests

Modified Paths:
--------------
    trunk/matplotlib/lib/matplotlib/axes.py
    trunk/matplotlib/lib/matplotlib/axis.py
    trunk/matplotlib/lib/matplotlib/dates.py
    trunk/matplotlib/lib/matplotlib/transforms.py
    trunk/matplotlib/lib/matplotlib/units.py

Added Paths:
-----------
    trunk/matplotlib/lib/matplotlib/tests/test_dates.py

Modified: trunk/matplotlib/lib/matplotlib/axes.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/axes.py     2009-09-06 20:13:36 UTC (rev 
7660)
+++ trunk/matplotlib/lib/matplotlib/axes.py     2009-09-06 21:16:27 UTC (rev 
7661)
@@ -2299,74 +2299,19 @@
 
         *tz* is the time zone to use in labeling dates.  Defaults to rc value.
         """
+        # should be enough to inform the unit conversion interface
+        # dates are comng in
+        self.xaxis.update_units(datetime.date(2009,1,1))
 
-        xmin, xmax = self.dataLim.intervalx
-        if xmin==0.:
-            # no data has been added - let's set the default datalim.
-            # We should probably use a better proxy for the datalim
-            # have been updated than the ignore setting
-            dmax = today = datetime.date.today()
-            dmin = today-datetime.timedelta(days=10)
-            self._process_unit_info(xdata=(dmin, dmax))
-            dmin, dmax = self.convert_xunits([dmin, dmax])
-            self.viewLim.intervalx = dmin, dmax
-            self.dataLim.intervalx = dmin, dmax
-
-        locator = self.xaxis.get_major_locator()
-        if not isinstance(locator, mdates.DateLocator):
-            locator = mdates.AutoDateLocator(tz)
-            self.xaxis.set_major_locator(locator)
-
-        # the autolocator uses the viewlim to pick the right date
-        # locator, but it may not have correct viewlim before an
-        # autoscale.  If the viewlim is still zero..1, set it to the
-        # datalim and the autoscaler will update it on request
-        if self.viewLim.intervalx[0]==0.:
-            self.viewLim.intervalx = tuple(self.dataLim.intervalx)
-        locator.refresh()
-
-        formatter = self.xaxis.get_major_formatter()
-        if not isinstance(formatter, mdates.DateFormatter):
-            formatter = mdates.AutoDateFormatter(locator, tz)
-            self.xaxis.set_major_formatter(formatter)
-
     def yaxis_date(self, tz=None):
         """Sets up y-axis ticks and labels that treat the y data as dates.
 
         *tz* is the time zone to use in labeling dates.  Defaults to rc value.
         """
-        ymin, ymax = self.dataLim.intervaly
-        if ymin==0.:
-            # no data has been added - let's set the default datalim.
-            # We should probably use a better proxy for the datalim
-            # have been updated than the ignore setting
-            dmax = today = datetime.date.today()
-            dmin = today-datetime.timedelta(days=10)
-            self._process_unit_info(ydata=(dmin, dmax))
+        # should be enough to inform the unit conversion interface
+        # dates are comng in
+        self.yaxis.update_units(datetime.date(2009,1,1))
 
-            dmin, dmax = self.convert_yunits([dmin, dmax])
-            self.viewLim.intervaly = dmin, dmax
-            self.dataLim.intervaly = dmin, dmax
-
-
-        locator = self.yaxis.get_major_locator()
-        if not isinstance(locator, mdates.DateLocator):
-            locator = mdates.AutoDateLocator(tz)
-            self.yaxis.set_major_locator(locator)
-
-        # the autolocator uses the viewlim to pick the right date
-        # locator, but it may not have correct viewlim before an
-        # autoscale.  If the viewlim is still zero..1, set it to the
-        # datalim and the autoscaler will update it on request
-        if self.viewLim.intervaly[0]==0.:
-            self.viewLim.intervaly = tuple(self.dataLim.intervaly)
-        locator.refresh()
-
-        formatter = self.xaxis.get_major_formatter()
-        if not isinstance(formatter, mdates.DateFormatter):
-            formatter = mdates.AutoDateFormatter(locator, tz)
-            self.yaxis.set_major_formatter(formatter)
-
     def format_xdata(self, x):
         """
         Return *x* string formatted.  This function will use the attribute

Modified: trunk/matplotlib/lib/matplotlib/axis.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/axis.py     2009-09-06 20:13:36 UTC (rev 
7660)
+++ trunk/matplotlib/lib/matplotlib/axis.py     2009-09-06 21:16:27 UTC (rev 
7661)
@@ -666,6 +666,19 @@
         'Set the axis data limits'
         raise NotImplementedError('Derived must override')
 
+    def set_default_intervals(self):
+        'set the default limits for the axis data and view interval if they 
are not mutated'
+
+        # this is mainly in support of custom object plotting.  For
+        # example, if someone passes in a datetime object, we do not
+        # know automagically how to set the default min/max of the
+        # data and view limits.  The unit conversion AxisInfo
+        # interface provides a hook for custom types to register
+        # default limits through the AxisInfo.default_limits
+        # attribute, and the derived code below will check for that
+        # and use it if is available (else just use 0..1)
+        pass
+
     def _set_artist_props(self, a):
         if a is None: return
         a.set_figure(self.figure)
@@ -1010,6 +1023,7 @@
             self.set_label_text(info.label)
             self.isDefault_label = True
 
+        self.set_default_intervals()
 
     def have_units(self):
         return self.converter is not None or self.units is not None
@@ -1420,6 +1434,25 @@
             self.axes.dataLim.intervalx = min(vmin, Vmin), max(vmax, Vmax)
 
 
+    def set_default_intervals(self):
+        'set the default limits for the axis interval if they are not mutated'
+        xmin, xmax = 0., 1.
+        dataMutated = self.axes.dataLim.mutatedx()
+        viewMutated = self.axes.viewLim.mutatedx()
+        if not dataMutated or not viewMutated:
+            if self.converter is not None:
+                info = self.converter.axisinfo(self.units, self)
+                if info.default_limits is not None:            
+                    valmin, valmax = info.default_limits
+                    xmin = self.converter.convert(valmin, self.units, self)
+                    xmax = self.converter.convert(valmax, self.units, self)
+            if not dataMutated:
+                self.axes.dataLim.intervalx = xmin, xmax
+            if not viewMutated:
+                self.axes.viewLim.intervalx = xmin, xmax
+
+            
+
 class YAxis(Axis):
     __name__ = 'yaxis'
     axis_name = 'y'
@@ -1665,3 +1698,22 @@
         else:
             Vmin, Vmax = self.get_data_interval()
             self.axes.dataLim.intervaly = min(vmin, Vmin), max(vmax, Vmax)
+
+    def set_default_intervals(self):
+        'set the default limits for the axis interval if they are not mutated'
+        ymin, ymax = 0., 1.
+        dataMutated = self.axes.dataLim.mutatedy()
+        viewMutated = self.axes.viewLim.mutatedy()
+        if not dataMutated or not viewMutated:
+            if self.converter is not None:
+                info = self.converter.axisinfo(self.units, self)
+                if info.default_limits is not None:            
+                    valmin, valmax = info.default_limits
+                    ymin = self.converter.convert(valmin, self.units, self)
+                    ymax = self.converter.convert(valmax, self.units, self)
+            if not dataMutated:
+                self.axes.dataLim.intervaly = ymin, ymax
+            if not viewMutated:
+                self.axes.viewLim.intervaly = ymin, ymax
+
+            

Modified: trunk/matplotlib/lib/matplotlib/dates.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/dates.py    2009-09-06 20:13:36 UTC (rev 
7660)
+++ trunk/matplotlib/lib/matplotlib/dates.py    2009-09-06 21:16:27 UTC (rev 
7661)
@@ -1062,42 +1062,15 @@
     def axisinfo(unit, axis):
         'return the unit AxisInfo'
         # make sure that the axis does not start at 0
-        if axis:
-            ax = axis.axes
 
-            if axis is ax.get_xaxis():
-                xmin, xmax = ax.dataLim.intervalx
-                if xmin==0.:
-                    # no data has been added - let's set the default datalim.
-                    # We should probably use a better proxy for the datalim
-                    # have been updated than the ignore setting
-                    dmax = today = datetime.date.today()
-                    dmin = today-datetime.timedelta(days=10)
-
-                    ax._process_unit_info(xdata=(dmin, dmax))
-                    dmin, dmax = ax.convert_xunits([dmin, dmax])
-
-                    ax.viewLim.intervalx = dmin, dmax
-                    ax.dataLim.intervalx = dmin, dmax
-            elif axis is ax.get_yaxis():
-                ymin, ymax = ax.dataLim.intervaly
-                if ymin==0.:
-                    # no data has been added - let's set the default datalim.
-                    # We should probably use a better proxy for the datalim
-                    # have been updated than the ignore setting
-                    dmax = today = datetime.date.today()
-                    dmin = today-datetime.timedelta(days=10)
-
-                    ax._process_unit_info(ydata=(dmin, dmax))
-                    dmin, dmax = ax.convert_yunits([dmin, dmax])
-
-                    ax.viewLim.intervaly = dmin, dmax
-                    ax.dataLim.intervaly = dmin, dmax
-
         majloc = AutoDateLocator(tz=unit)
         majfmt = AutoDateFormatter(majloc, tz=unit)
-        return units.AxisInfo( majloc=majloc, majfmt=majfmt, label='' )
+        datemin = datetime.date(2000, 1, 1) 
+        datemax = datetime.date(2010, 1, 1)  
 
+        return units.AxisInfo( majloc=majloc, majfmt=majfmt, label='', 
+                               default_limits=(datemin, datemax))
+
     @staticmethod
     def convert(value, unit, axis):
         if units.ConversionInterface.is_numlike(value): return value

Added: trunk/matplotlib/lib/matplotlib/tests/test_dates.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/tests/test_dates.py                         
(rev 0)
+++ trunk/matplotlib/lib/matplotlib/tests/test_dates.py 2009-09-06 21:16:27 UTC 
(rev 7661)
@@ -0,0 +1,76 @@
+import datetime 
+import numpy as np
+import matplotlib
+matplotlib.use('Agg')
+from matplotlib.testing.decorators import image_comparison
+import matplotlib.pyplot as plt
+
+...@image_comparison(baseline_images=['empty_datetime.png'])
+def test_empty_datetime():
+    # make sure mpl does the right thing when told to plot dates even
+    # if no date data has been presented, cf
+    # 
http://sourceforge.net/tracker/?func=detail&aid=2850075&group_id=80706&atid=560720
+    fig = plt.figure()
+    ax = fig.add_subplot(1,1,1)
+    ax.xaxis_date()
+    fig.savefig('empty_datetime.png')
+
+...@image_comparison(baseline_images=['date_axhspan.png'])
+def test_date_axhspan():
+    # test ax hspan with date inputs
+    t0 = datetime.datetime(2009, 1, 20)
+    tf = datetime.datetime(2009, 1, 21)
+    fig = plt.figure()
+    ax = fig.add_subplot(1,1,1)
+    ax.axhspan( t0, tf, facecolor="blue", alpha=0.25 )
+    ax.set_xlim(t0-datetime.timedelta(days=5), 
+                tf+datetime.timedelta(days=5))
+    fig.autofmt_xdate()
+    fig.savefig('date_axhspan.png')
+
+...@image_comparison(baseline_images=['date_axvspan.png'])
+def test_date_axvspan():
+    # test ax hspan with date inputs
+    t0 = datetime.datetime(2000, 1, 20)
+    tf = datetime.datetime(2010, 1, 21)
+    fig = plt.figure()
+    ax = fig.add_subplot(1,1,1)
+    ax.axvspan( t0, tf, facecolor="blue", alpha=0.25 )
+    ax.set_xlim(t0-datetime.timedelta(days=5), 
+                tf+datetime.timedelta(days=5))
+    fig.autofmt_xdate()
+    fig.savefig('date_axvspan.png')
+
+
+...@image_comparison(baseline_images=['date_axhline.png'])
+def test_date_axhline():
+    # test ax hline with date inputs
+    t0 = datetime.datetime(2009, 1, 20)
+    tf = datetime.datetime(2009, 1, 31)
+    fig = plt.figure()
+    ax = fig.add_subplot(1,1,1)
+    ax.axhline( t0, tf, facecolor="blue", lw=3)
+    ax.set_xlim(t0-datetime.timedelta(days=5), 
+                tf+datetime.timedelta(days=5))
+    fig.autofmt_xdate()
+    fig.savefig('date_axhline.png')
+
+...@image_comparison(baseline_images=['date_axvline.png'])
+def test_date_axvline():
+    # test ax hline with date inputs
+    t0 = datetime.datetime(2000, 1, 20)
+    tf = datetime.datetime(2010, 1, 21)
+    fig = plt.figure()
+    ax = fig.add_subplot(1,1,1)
+    ax.axvline( t0, tf, facecolor="blue", lw=3)
+    ax.set_xlim(t0-datetime.timedelta(days=5), 
+                tf+datetime.timedelta(days=5))
+    fig.autofmt_xdate()
+    fig.savefig('date_axvline.png')
+
+
+if __name__=='__main__':
+    import nose
+    nose.runmodule(argv=['-s','--with-doctest'], exit=False)                   
  
+
+

Modified: trunk/matplotlib/lib/matplotlib/transforms.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/transforms.py       2009-09-06 20:13:36 UTC 
(rev 7660)
+++ trunk/matplotlib/lib/matplotlib/transforms.py       2009-09-06 21:16:27 UTC 
(rev 7661)
@@ -711,7 +711,10 @@
         self._points = np.asarray(points, np.float_)
         self._minpos = np.array([0.0000001, 0.0000001])
         self._ignore = True
-
+        # it is helpful in some contexts to know if the bbox is a
+        # default or has been mutated; we store the orig points to
+        # support the mutated methods
+        self._points_orig = self._points.copy()
     if DEBUG:
         ___init__ = __init__
         def __init__(self, points):
@@ -939,7 +942,22 @@
             self._points = other.get_points()
             self.invalidate()
 
+    def mutated(self):
+        'return whether the bbox has changed since init'
+        return self.mutatedx() or self.mutatedy()
 
+    def mutatedx(self):
+        'return whether the x-limits have changed since init'
+        return (self._points[0,0]!=self._points_orig[0,0] or
+                self._points[1,0]!=self._points_orig[1,0])
+    def mutatedy(self):
+        'return whether the y-limits have changed since init'
+        return (self._points[0,1]!=self._points_orig[0,1] or
+                self._points[1,1]!=self._points_orig[1,1])
+
+
+    
+
 class TransformedBbox(BboxBase):
     """
     A :class:`Bbox` that is automatically transformed by a given

Modified: trunk/matplotlib/lib/matplotlib/units.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/units.py    2009-09-06 20:13:36 UTC (rev 
7660)
+++ trunk/matplotlib/lib/matplotlib/units.py    2009-09-06 21:16:27 UTC (rev 
7661)
@@ -46,14 +46,15 @@
 from matplotlib.cbook import iterable, is_numlike, is_string_like
 
 class AxisInfo:
-    'information to support default axis labeling and tick labeling'
+    'information to support default axis labeling and tick labeling, and 
default limits'
     def __init__(self, majloc=None, minloc=None,
-                 majfmt=None, minfmt=None, label=None):
+                 majfmt=None, minfmt=None, label=None, 
+                 default_limits=None):
         """
         majloc and minloc: TickLocators for the major and minor ticks
         majfmt and minfmt: TickFormatters for the major and minor ticks
         label: the default axis label
-
+        default_limits: the default min, max of the axis if no data is present
         If any of the above are None, the axis will simply use the default
         """
         self.majloc = majloc
@@ -61,6 +62,7 @@
         self.majfmt = majfmt
         self.minfmt = minfmt
         self.label = label
+        self.default_limits = default_limits
 
 
 class ConversionInterface:


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to