Revision: 6939
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6939&view=rev
Author: leejjoon
Date: 2009-02-26 20:12:38 +0000 (Thu, 26 Feb 2009)
Log Message:
-----------
Add optional bbox_to_anchor argument for legend class
Modified Paths:
--------------
trunk/matplotlib/CHANGELOG
trunk/matplotlib/examples/pylab_examples/legend_demo3.py
trunk/matplotlib/lib/matplotlib/legend.py
Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG 2009-02-26 19:54:48 UTC (rev 6938)
+++ trunk/matplotlib/CHANGELOG 2009-02-26 20:12:38 UTC (rev 6939)
@@ -1,3 +1,5 @@
+2009-02-26 Add optional bbox_to_anchor argument for legend class - JJL
+
2009-02-26 Support image clipping in pdf backend. - JKS
2009-02-25 Improve tick location subset choice in FixedLocator. - EF
Modified: trunk/matplotlib/examples/pylab_examples/legend_demo3.py
===================================================================
--- trunk/matplotlib/examples/pylab_examples/legend_demo3.py 2009-02-26
19:54:48 UTC (rev 6938)
+++ trunk/matplotlib/examples/pylab_examples/legend_demo3.py 2009-02-26
20:12:38 UTC (rev 6939)
@@ -3,7 +3,6 @@
matplotlib.rcParams['legend.fancybox'] = True
import matplotlib.pyplot as plt
import numpy as np
-import pylab
def myplot(ax):
t1 = np.arange(0.0, 1.0, 0.1)
@@ -18,7 +17,8 @@
ax2 = plt.subplot(3,1,2)
myplot(ax2)
-ax2.legend(loc=1, ncol=2, shadow=True, title="Legend")
+ax2.legend(loc="center left", bbox_to_anchor=[0.5, 0.5],
+ ncol=2, shadow=True, title="Legend")
ax2.get_legend().get_title().set_color("red")
ax3 = plt.subplot(3,1,3)
@@ -26,8 +26,6 @@
ax3.legend(loc=1, ncol=4, mode="expand", shadow=True)
-#title('Damped oscillation')
-
plt.draw()
plt.show()
Modified: trunk/matplotlib/lib/matplotlib/legend.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/legend.py 2009-02-26 19:54:48 UTC (rev
6938)
+++ trunk/matplotlib/lib/matplotlib/legend.py 2009-02-26 20:12:38 UTC (rev
6939)
@@ -32,7 +32,7 @@
from matplotlib.lines import Line2D
from matplotlib.patches import Patch, Rectangle, Shadow, FancyBboxPatch
from matplotlib.collections import LineCollection, RegularPolyCollection
-from matplotlib.transforms import Bbox
+from matplotlib.transforms import Bbox, TransformedBbox, BboxTransformTo
from matplotlib.offsetbox import HPacker, VPacker, TextArea, DrawingArea
@@ -112,6 +112,7 @@
fancybox=None, # True use a fancy box, false use a rounded
box, none use rc
shadow = None,
title = None, # set a title for the legend
+ bbox_to_anchor = None, # bbox thaw the legend will be
anchored.
):
"""
- *parent* : the artist that contains the legend
@@ -137,6 +138,7 @@
borderaxespad the pad between the axes and legend border
columnspacing the spacing between columns
title the legend title
+ bbox_to_anchor the bbox that the legend will be anchored.
================
==================================================================
The dimensions of pad and spacing are given as a fraction of the
@@ -249,7 +251,8 @@
self._loc = loc
self._mode = mode
-
+ self.set_bbox_to_anchor(bbox_to_anchor)
+
# We use FancyBboxPatch to draw a legend frame. The location
# and size of the box will be updated during the drawing time.
self.legendPatch = FancyBboxPatch(
@@ -294,6 +297,7 @@
a.set_transform(self.get_transform())
+
def _findoffset_best(self, width, height, xdescent, ydescent, renderer):
"Heper function to locate the legend at its best position"
ox, oy = self._find_best_position(width, height, renderer)
@@ -305,11 +309,11 @@
if iterable(self._loc) and len(self._loc)==2:
# when loc is a tuple of axes(or figure) coordinates.
fx, fy = self._loc
- bbox = self.parent.bbox
+ bbox = self.get_bbox_to_anchor()
x, y = bbox.x0 + bbox.width * fx, bbox.y0 + bbox.height * fy
else:
bbox = Bbox.from_bounds(0, 0, width, height)
- x, y = self._get_anchored_bbox(self._loc, bbox, self.parent.bbox,
renderer)
+ x, y = self._get_anchored_bbox(self._loc, bbox,
self.get_bbox_to_anchor(), renderer)
return x+xdescent, y+ydescent
@@ -340,7 +344,7 @@
# width of the paret (minus pads)
if self._mode in ["expand"]:
pad = 2*(self.borderaxespad+self.borderpad)*fontsize
- self._legend_box.set_width(self.parent.bbox.width-pad)
+ self._legend_box.set_width(self.get_bbox_to_anchor().width-pad)
if self._drawFrame:
# update the location and size of the legend
@@ -671,6 +675,48 @@
return self.legendPatch.get_window_extent()
+ def get_bbox_to_anchor(self):
+ """
+ return the bbox that the legend will be anchored
+ """
+ if self._bbox_to_anchor is None:
+ return self.parent.bbox
+ else:
+ return self._bbox_to_anchor
+
+
+ def set_bbox_to_anchor(self, bbox, transform=None):
+ """
+ set the bbox that the legend will be anchored.
+
+ *bbox* can be a Bbox instance, a list of [left, bottom, width,
+ height] in normalized axes coordinate, or a list of [left,
+ bottom] where the width and height will be assumed to be zero.
+ """
+ if bbox is None:
+ self._bbox_to_anchor = None
+ return
+ elif isinstance(bbox, Bbox):
+ self._bbox_to_anchor = bbox
+ else:
+ try:
+ l = len(bbox)
+ except TypeError:
+ raise ValueError("Invalid argument for bbox : %s" % str(bbox))
+
+ if l == 2:
+ bbox = [bbox[0], bbox[1], 0, 0]
+
+ self._bbox_to_anchor = Bbox.from_bounds(*bbox)
+
+ if transform is None:
+ transform = BboxTransformTo(self.parent.bbox)
+
+ self._bbox_to_anchor = TransformedBbox(self._bbox_to_anchor,
+ transform)
+
+
+
def _get_anchored_bbox(self, loc, bbox, parentbbox, renderer):
"""
Place the *bbox* inside the *parentbbox* according to a given
@@ -719,7 +765,8 @@
verts, bboxes, lines = self._auto_legend_data()
bbox = Bbox.from_bounds(0, 0, width, height)
- consider = [self._get_anchored_bbox(x, bbox, self.parent.bbox,
renderer) for x in range(1, len(self.codes))]
+ consider = [self._get_anchored_bbox(x, bbox, self.get_bbox_to_anchor(),
+ renderer) for x in range(1,
len(self.codes))]
#tx, ty = self.legendPatch.get_x(), self.legendPatch.get_y()
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins