Revision: 8731
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8731&view=rev
Author:   mdboom
Date:     2010-10-06 16:57:16 +0000 (Wed, 06 Oct 2010)

Log Message:
-----------
[3081451] symlog doesn't handle values <1.0 correctly

Modified Paths:
--------------
    trunk/matplotlib/lib/matplotlib/scale.py
    trunk/matplotlib/lib/matplotlib/ticker.py

Modified: trunk/matplotlib/lib/matplotlib/scale.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/scale.py    2010-10-06 16:03:48 UTC (rev 
8730)
+++ trunk/matplotlib/lib/matplotlib/scale.py    2010-10-06 16:57:16 UTC (rev 
8731)
@@ -6,6 +6,7 @@
 from cbook import dedent
 from ticker import NullFormatter, ScalarFormatter, LogFormatterMathtext, 
Formatter
 from ticker import NullLocator, LogLocator, AutoLocator, 
SymmetricalLogLocator, FixedLocator
+from ticker import is_decade
 from transforms import Transform, IdentityTransform
 from matplotlib import docstring
 
@@ -318,19 +319,22 @@
         def __init__(self, base, linthresh):
             Transform.__init__(self)
             self.base = base
-            self.linthresh = linthresh
+            self.linthresh = abs(linthresh)
             self._log_base = np.log(base)
-            self._linadjust = (np.log(linthresh) / self._log_base) / linthresh
+            self._logb_linthresh = np.log(linthresh) / self._log_base
+            self._logb_minlog = np.floor(self._logb_linthresh - 1e-10)
+            self._linadjust = np.abs((np.log(linthresh) - self._logb_minlog) /
+                                     linthresh)
 
         def transform(self, a):
             a = np.asarray(a)
             sign = np.sign(a)
             masked = ma.masked_inside(a, -self.linthresh, self.linthresh, 
copy=False)
-            log = sign * ma.log(np.abs(masked)) / self._log_base
+            log = sign * (ma.log(np.abs(masked)) / self._log_base - 
self._logb_minlog)
             if masked.mask.any():
                 return np.asarray(ma.where(masked.mask,
-                                            a * self._linadjust,
-                                            log))
+                                           a * self._linadjust,
+                                           log))
             else:
                 return np.asarray(log)
 

Modified: trunk/matplotlib/lib/matplotlib/ticker.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/ticker.py   2010-10-06 16:03:48 UTC (rev 
8730)
+++ trunk/matplotlib/lib/matplotlib/ticker.py   2010-10-06 16:57:16 UTC (rev 
8731)
@@ -1180,20 +1180,20 @@
     'floor x to the nearest lower decade'
     if x == 0.0:
         return -base
-    lx = math.floor(math.log(x)/math.log(base))
+    lx = np.floor(np.log(x)/np.log(base))
     return base**lx
 
 def decade_up(x, base=10):
     'ceil x to the nearest higher decade'
     if x == 0.0:
         return base
-    lx = math.ceil(math.log(x)/math.log(base))
+    lx = np.ceil(np.log(x)/np.log(base))
     return base**lx
 
 def is_decade(x,base=10):
     if x == 0.0:
         return True
-    lx = math.log(x)/math.log(base)
+    lx = np.log(x)/np.log(base)
     return lx==int(lx)
 
 class LogLocator(Locator):
@@ -1268,15 +1268,12 @@
             stride += 1
 
         decades = np.arange(math.floor(vmin),
-                             math.ceil(vmax)+stride, stride)
+                            math.ceil(vmax)+stride, stride)
+        ticklocs = self._transform.inverted().transform(decades)
         if len(subs) > 1 or (len(subs == 1) and subs[0] != 1.0):
-            ticklocs = []
-            for decadeStart in b**decades:
-                ticklocs.extend( subs*decadeStart )
-        else:
-            ticklocs = b**decades
+            ticklocs = np.ravel(np.outer(subs, ticklocs))
 
-        return self.raise_if_exceeds(np.array(ticklocs))
+        return self.raise_if_exceeds(np.asarray(ticklocs))
 
     def view_limits(self, vmin, vmax):
         'Try to choose the view limits intelligently'


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

------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
Matplotlib-checkins mailing list
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to