Revision: 8877
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8877&view=rev
Author:   weathergod
Date:     2011-01-03 21:36:37 +0000 (Mon, 03 Jan 2011)

Log Message:
-----------
Added the ability for 3d plots to display the axis ticker offsets.
This should address bug 3137231.

Modified Paths:
--------------
    trunk/matplotlib/CHANGELOG
    trunk/matplotlib/lib/mpl_toolkits/mplot3d/axis3d.py

Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG  2011-01-03 20:34:57 UTC (rev 8876)
+++ trunk/matplotlib/CHANGELOG  2011-01-03 21:36:37 UTC (rev 8877)
@@ -1,3 +1,5 @@
+2011-01-03 Added display of ticker offset to 3d plots. - BVR
+
 2011-01-03 Turn off tick labeling on interior subplots for
            pyplots.subplots when sharex/sharey is True. - JDH
 

Modified: trunk/matplotlib/lib/mpl_toolkits/mplot3d/axis3d.py
===================================================================
--- trunk/matplotlib/lib/mpl_toolkits/mplot3d/axis3d.py 2011-01-03 20:34:57 UTC 
(rev 8876)
+++ trunk/matplotlib/lib/mpl_toolkits/mplot3d/axis3d.py 2011-01-03 21:36:37 UTC 
(rev 8877)
@@ -96,8 +96,10 @@
         self.gridlines = art3d.Line3DCollection([], )
         self.axes._set_artist_props(self.gridlines)
         self.axes._set_artist_props(self.label)
+        self.axes._set_artist_props(self.offsetText)
         # Need to be able to place the label at the correct location
         self.label._transform = self.axes.transData
+        self.offsetText._transform = self.axes.transData
 
     def get_tick_positions(self):
         majorLocs = self.major.locator()
@@ -205,6 +207,7 @@
         edgep2 = edgep1.copy()
         edgep2[juggled[1]] = get_flip_min_max(edgep2, juggled[1], mins, maxs)
         pep = proj3d.proj_trans_points([edgep1, edgep2], renderer.M)
+        centpt = proj3d.proj_transform(centers[0], centers[1], centers[2], 
renderer.M)
         self.line.set_data((pep[0][0], pep[0][1]), (pep[1][0], pep[1][1]))
         self.line.draw(renderer)
 
@@ -243,6 +246,75 @@
         self.label.set_ha('center')
         self.label.draw(renderer)
 
+
+        # Draw Offset text
+        
+        # Which of the two edge points do we want to
+        # use for locating the offset text?
+        if juggled[2] == 2 :
+            outeredgep = edgep1
+            outerindex = 0
+        else :
+            outeredgep = edgep2
+            outerindex = 1
+
+        pos = copy.copy(outeredgep)
+        pos = move_from_center(pos, centers, labeldeltas, axmask)
+        olx, oly, olz = proj3d.proj_transform(pos[0], pos[1], pos[2], 
renderer.M)
+        self.offsetText.set_text( self.major.formatter.get_offset() )
+        self.offsetText.set_position( (olx, oly) )
+        angle = art3d.norm_text_angle(math.degrees(math.atan2(dy, dx)))
+        self.offsetText.set_rotation(angle)
+        # Must set rotation mode to "anchor" so that
+        # the alignment point is used as the "fulcrum" for rotation.
+        self.offsetText.set_rotation_mode('anchor')
+
+        
#-----------------------------------------------------------------------
+        # Note: the following statement for determining the proper alignment of
+        #       the offset text. This was determined entirely by 
trial-and-error
+        #       and should not be in any way considered as "the way".  There 
are
+        #       still some edge cases where alignment is not quite right, but
+        #       this seems to be more of a geometry issue (in other words, I
+        #       might be using the wrong reference points).
+        #
+        #   (TT, FF, TF, FT) are the shorthand for the tuple of
+        #     (centpt[info['tickdir']] <= peparray[info['tickdir'], 
outerindex],
+        #      centpt[index] <= peparray[index, outerindex])
+        #
+        #   Three-letters (e.g., TFT, FTT) are short-hand for the array
+        #    of bools from the variable 'highs'.
+        # ---------------------------------------------------------------------
+        if centpt[info['tickdir']] > peparray[info['tickdir'], outerindex] :
+            # if FT and if highs has an even number of Trues
+            if (centpt[index] <= peparray[index, outerindex]
+                and ((len(highs.nonzero()[0]) % 2) == 0)) :
+                # Usually, this means align right, except for the FTT case,
+                # in which offset for axis 1 and 2 are aligned left.
+                if highs.tolist() == [False, True, True] and index in (1, 2) :
+                    align = 'left'
+                else :
+                    align = 'right'
+            else :
+                # The FF case
+                align = 'left'
+        else :
+            # if TF and if highs has an even number of Trues
+            if (centpt[index] > peparray[index, outerindex]
+                and ((len(highs.nonzero()[0]) % 2) == 0)) :
+                # Usually mean align left, except if it is axis 2
+                if index == 2 :
+                    align = 'right'
+                else :
+                    align = 'left'
+            else :
+                # The TT case
+                align = 'right'
+
+        self.offsetText.set_va('center')
+        self.offsetText.set_ha(align)
+        self.offsetText.draw(renderer)
+
+        # Draw grid lines
         if len(xyz0) > 0:
             # Grid points at end of one plane
             xyz1 = copy.deepcopy(xyz0)


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

------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and, 
should the need arise, upgrade to a full multi-node Oracle RAC database 
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Matplotlib-checkins mailing list
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to