Hello, I sometimes want to add titles to legends in matplotlib. I couldn't find an existing way to do this (but if there is one, then please tell me!). So I have hacked together a patch to add a title keyword to the legend class, which adds the title to the top of the legend. I'm not sure it conforms very well to matplotlib style, but I have attached it to this message in case anyone else finds it useful.
Cheers, John
Index: lib/matplotlib/legend.py =================================================================== --- lib/matplotlib/legend.py (revision 4937) +++ lib/matplotlib/legend.py (working copy) @@ -92,7 +92,8 @@ handletextsep = None, # the space between the legend line and legend text axespad = None, # the border between the axes and legend edge - shadow = None + shadow = None, + title = None ): """ parent # the artist that contains the legend @@ -104,6 +105,7 @@ pad = 0.2 # the fractional whitespace inside the legend border markerscale = 0.6 # the relative size of legend markers vs. original shadow # if True, draw a shadow behind legend + title # set a title for the legend The following dimensions are in axes coords labelsep = 0.005 # the vertical space between the legend entries @@ -178,7 +180,22 @@ # based on it's bbox left, top = 0.5, 0.5 textleft = left+ self.handlelen+self.handletextsep - self.texts = self._get_texts(labels, textleft, top) + + ntop = top + self.title = None + if title != None: + ntop = ntop - self._approx_text_height() + text = Text( + x=textleft, y=top, + text=title, + fontproperties=self.prop, + verticalalignment='top', + horizontalalignment='center' + ) + self._set_artist_props(text) + self.title = text + + self.texts = self._get_texts(labels, textleft, ntop) self.legendHandles = self._get_handles(handles, self.texts) self._drawFrame = True @@ -208,6 +225,9 @@ h.draw(renderer) if 0: bbox_artist(h, renderer) + if self.title != None: + self.title.draw(renderer) + for t in self.texts: if 0: bbox_artist(t, renderer) t.draw(renderer) @@ -223,6 +243,11 @@ bboxesAll = bboxesText bboxesAll.extend(bboxesHandles) + + if self.title != None: + bboxesTitle = self.title.get_window_extent(renderer) + bboxesAll.extend([bboxesTitle]) + bbox = Bbox.union(bboxesAll) self.save = bbox @@ -491,6 +516,11 @@ h += 2*self.labelsep hpos.append( (b,h) ) + if self.title != None: + x,y = self.title.get_position() + l,b,w,h = get_tbounds(self.texts[0]) + self.title.set_position( (x, b+3*h) ) + for handle, tup in zip(self.legendHandles, hpos): y,h = tup if isinstance(handle, Line2D):
------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users