Revision: 6494
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6494&view=rev
Author:   leejjoon
Date:     2008-12-05 00:06:26 +0000 (Fri, 05 Dec 2008)

Log Message:
-----------
some minor changes for the legend

Modified Paths:
--------------
    trunk/matplotlib/CHANGELOG
    trunk/matplotlib/examples/pylab_examples/legend_demo3.py
    trunk/matplotlib/lib/matplotlib/legend.py
    trunk/matplotlib/lib/matplotlib/offsetbox.py

Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG  2008-12-04 22:13:57 UTC (rev 6493)
+++ trunk/matplotlib/CHANGELOG  2008-12-05 00:06:26 UTC (rev 6494)
@@ -1,3 +1,7 @@
+2008-12-04 Added fancybox keyword to legend. Also applied some changes
+          for better look, including baseline adjustment of the
+          multiline texts so that it is center aligned. -JJL
+
 2008-12-02 The transmuter classes in the patches.py are reorganized as
            subclasses of the Style classes. A few more box and arrow 
           styles are added. -JJL

Modified: trunk/matplotlib/examples/pylab_examples/legend_demo3.py
===================================================================
--- trunk/matplotlib/examples/pylab_examples/legend_demo3.py    2008-12-04 
22:13:57 UTC (rev 6493)
+++ trunk/matplotlib/examples/pylab_examples/legend_demo3.py    2008-12-05 
00:06:26 UTC (rev 6494)
@@ -2,6 +2,7 @@
 
 import matplotlib.pyplot as plt
 import numpy as np
+import pylab
 
 def myplot(ax):
     t1 = np.arange(0.0, 1.0, 0.1)
@@ -21,7 +22,7 @@
 
 ax3 = plt.subplot(3,1,3)
 myplot(ax3)
-ax3.legend(loc=1, ncol=4, mode="expand", shadow=True)
+ax3.legend(loc=1, ncol=4, mode="expand", fancybox=False, shadow=True)
 
 
 #title('Damped oscillation')

Modified: trunk/matplotlib/lib/matplotlib/legend.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/legend.py   2008-12-04 22:13:57 UTC (rev 
6493)
+++ trunk/matplotlib/lib/matplotlib/legend.py   2008-12-05 00:06:26 UTC (rev 
6494)
@@ -113,6 +113,7 @@
                  ncol=1, # number of columns
                  mode=None, # mode for horizontal distribution of columns. 
None, "expand"
 
+                 fancybox=True,
                  shadow = None,
                  ):
         """
@@ -130,6 +131,7 @@
         numpoints          the number of points in the legend line
         prop               the font property
         markerscale        the relative size of legend markers vs. original
+        fancybox           if True, draw a frame with a round fancybox.
         shadow             if True, draw a shadow behind legend
         scatteryoffsets    a list of yoffsets for scatter symbols in legend
 
@@ -263,8 +265,11 @@
         # The width and height of the legendPatch will be set (in the
         # draw()) to the length that includes the padding. Thus we set
         # pad=0 here.
-        self.legendPatch.set_boxstyle("round",pad=0, #self.borderpad,
-                                      rounding_size=0.2)
+        if fancybox == True:
+            self.legendPatch.set_boxstyle("round",pad=0,
+                                          rounding_size=0.2)
+        else:
+            self.legendPatch.set_boxstyle("square",pad=0)
 
         self._set_artist_props(self.legendPatch)
 
@@ -378,7 +383,8 @@
         labelboxes = []
 
         for l in labels:
-            textbox = TextArea(l, textprops=label_prop)
+            textbox = TextArea(l, textprops=label_prop
+                               multilinebaseline=True, minimumdescent=True)
             text_list.append(textbox._text)
             labelboxes.append(textbox)
 
@@ -387,8 +393,8 @@
 
         # The approximate height and descent of text. These values are
         # only used for plotting the legend handle.
-        height = self._approx_text_height() * 0.6
-        descent = 0. #height/6.
+        height = self._approx_text_height() * 0.7
+        descent = 0. 
 
         # each handle needs to be drawn inside a box of
         # (x, y, w, h) = (0, -descent, width, height).
@@ -440,9 +446,9 @@
                 legline._legmarker = legline_marker
 
             elif isinstance(handle, Patch):
-                p = Rectangle(xy=(0, -0.*descent),
+                p = Rectangle(xy=(0., 0.),
                               width = self.handlelength*self.fontsize,
-                              height=0.*descent+(height-descent)*.9,
+                              height=(height-descent),
                               )
                 p.update_from(handle)
                 self._set_artist_props(p)
@@ -513,12 +519,12 @@
         num_smallcol = self._ncol-num_largecol
 
         # starting index of each column and number of rows in it.
-        largecol = zip(range(0, num_largecol*(nrows+1), (nrows+1)),
-                       [nrows+1] * num_largecol)
-        smallcol = zip(range(num_largecol*(nrows+1), len(handleboxes), nrows),
-                       [nrows] * num_smallcol)
+        largecol = safezip(range(0, num_largecol*(nrows+1), (nrows+1)),
+                           [nrows+1] * num_largecol)
+        smallcol = safezip(range(num_largecol*(nrows+1), len(handleboxes), 
nrows),
+                           [nrows] * num_smallcol)
 
-        handle_label = zip(handleboxes, labelboxes)
+        handle_label = safezip(handleboxes, labelboxes)
         columnbox = []
         for i0, di in largecol+smallcol:
             # pack handleBox and labelBox into itemBox
@@ -526,6 +532,8 @@
                                     sep=self.handletextpad*self.fontsize,
                                     children=[h, t], align="baseline")
                          for h, t in handle_label[i0:i0+di]]
+            # minimumdescent=False for the text of the last row of the column
+            itemBoxes[-1].get_children()[1].set_minimumdescent(False)
             
             # pack columnBox
             columnbox.append(VPacker(pad=0,

Modified: trunk/matplotlib/lib/matplotlib/offsetbox.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/offsetbox.py        2008-12-04 22:13:57 UTC 
(rev 6493)
+++ trunk/matplotlib/lib/matplotlib/offsetbox.py        2008-12-05 00:06:26 UTC 
(rev 6494)
@@ -23,9 +23,9 @@
 from matplotlib.patches import bbox_artist as mbbox_artist
 DEBUG=False
 # for debuging use
-def bbox_artist(*kl, **kw):
+def bbox_artist(*args, **kwargs):
     if DEBUG:
-        mbbox_artist(*kl, **kw)
+        mbbox_artist(*args, **kwargs)
 
 
 # _get_packed_offsets() and _get_aligned_offsets() are coded assuming
@@ -122,9 +122,9 @@
     The OffsetBox is a simple container artist. The child artist are meant
     to be drawn at a relative position to its parent.  
     """
-    def __init__(self, *kl, **kw):
+    def __init__(self, *args, **kwargs):
 
-        super(OffsetBox, self).__init__(*kl, **kw)
+        super(OffsetBox, self).__init__(*args, **kwargs)
         
         self._children = []        
         self._offset = (0, 0)
@@ -441,10 +441,18 @@
 
 
     
-    def __init__(self, s, textprops=None, **kw):
+    def __init__(self, s,
+                 textprops=None,
+                 multilinebaseline=None,
+                 minimumdescent=True,
+                 ):
         """
-        *s* : a string to be displayer.
-        *trnaspose* : transformation matrrix 
+        *s* : a string to be displayed.
+        *textprops* : property dictionary for the text
+        *multilinebaseline* : If True, baseline for multiline text is
+                              adjusted so that it is (approximatedly)
+                              center-aligned with singleline text.
+        *minimumdescent*  : If True, the box has a minimum descent of "p".
         """
         if textprops is None:
             textprops = {}
@@ -462,9 +470,48 @@
         self.offset_transform = mtransforms.Affine2D()
         self.offset_transform.clear()
         self.offset_transform.translate(0, 0)
-        self._text.set_transform(self.offset_transform)
+        self._baseline_transform = mtransforms.Affine2D()
+        
self._text.set_transform(self.offset_transform+self._baseline_transform)
 
+        self._multilinebaseline = multilinebaseline
+        self._minimumdescent = minimumdescent
+        
 
+    def set_multilinebaseline(self, t):
+        """
+        Set multilinebaseline .
+
+        If True, baseline for multiline text is
+        adjusted so that it is (approximatedly) center-aligned with
+        singleline text.
+        """
+        self._multilinebaseline = t
+
+
+    def get_multilinebaseline(self):
+        """
+        get multilinebaseline .
+        """
+        return self._multilinebaseline
+
+
+    def set_minimumdescent(self, t):
+        """
+        Set minimumdescent .
+
+        If True, extent of the single line text is adjusted so that 
+        it has minimum descent of "p"
+        """
+        self._minimumdescent = t
+
+
+    def get_minimumdescent(self):
+        """
+        get minimumdescent.
+        """
+        return self._minimumdescent
+
+
     def set_transform(self, t):
         """
         set_transform is ignored.
@@ -507,17 +554,34 @@
 
         bbox, info = self._text._get_layout(renderer)
         w, h = bbox.width, bbox.height
+
         line = info[0][0] # first line
 
         _, hh, dd = renderer.get_text_width_height_descent(
             line, self._text._fontproperties, ismath=ismath)
-        d = h-(hh-dd)  # the baseline of the first line
 
-        # for multiple lines, h or d may greater than h_ or d_.
-        h_d = max(h_ - d_, h-d)
-        d = max(d, d_)
-        h = h_d + d
 
+        self._baseline_transform.clear()
+        if len(info) > 1 and self._multilinebaseline: # multi line
+            d = h-(hh-dd)  # the baseline of the first line
+            d_new = 0.5 * h  - 0.5 * (h_ - d_)
+            
+            self._baseline_transform.translate(0, d - d_new)
+            d = d_new
+            
+        else: # single line
+
+            h_d = max(h_ - d_, h-dd)
+
+            if self.get_minimumdescent():
+                ## to have a minimum descent, #i.e., "l" and "p" have same
+                ## descents. 
+                d = max(dd, d_)
+            else:
+                d = dd
+
+            h = h_d + d
+            
         return w, h, 0., d
 
 


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

------------------------------------------------------------------------------
SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada.
The future of the web can't happen without you.  Join us at MIX09 to help
pave the way to the Next Web now. Learn more and register at
http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to