Source code for rootpy.plotting.legend
from __future__ import absolute_import
import numbers
from .. import ROOT, QROOT, asrootpy
from ..base import Object
from .hist import HistStack
from .box import _Positionable
from ..memory.keepalive import keepalive
__all__ = [
'Legend',
]
[docs]class Legend(_Positionable, Object, QROOT.TLegend):
_ROOT = QROOT.TLegend
def __init__(self, entries,
pad=None,
leftmargin=0.5,
topmargin=0.05,
rightmargin=0.05,
entryheight=0.06,
entrysep=0.02,
margin=0.3,
textfont=None,
textsize=None,
header=None):
if pad is None:
pad = ROOT.gPad
if not pad:
raise RuntimeError("create a pad before a legend")
entries_is_list = False
if isinstance(entries, numbers.Integral):
# entries is the expected number of entries that will be included
# in the legend
nentries = entries
else:
# entries is a list of objects to become entries in the legend
entries_is_list = True
nentries = len(entries)
if header is not None:
nentries += 1
height = (entryheight + entrysep) * nentries - entrysep
super(Legend, self).__init__(
pad.GetLeftMargin() + leftmargin,
(1. - pad.GetTopMargin() - topmargin) - height,
1. - pad.GetRightMargin() - rightmargin,
((1. - pad.GetTopMargin()) - topmargin))
self.SetEntrySeparation(entrysep)
self.SetMargin(margin)
if header is not None:
self.SetHeader(header)
# ROOT, why are you filling my legend with a
# grey background by default?
self.SetFillStyle(0)
self.SetFillColor(0)
if textfont is None:
textfont = ROOT.gStyle.GetLegendFont()
if textsize is None:
textsize = ROOT.gStyle.GetTextSize()
self.SetTextFont(textfont)
self.SetTextSize(textsize)
if entries_is_list:
for thing in entries:
self.AddEntry(thing)
def Height(self):
return abs(self.GetY2() - self.GetY1())
def Width(self):
return abs(self.GetX2() - self.GetX1())
def Draw(self, *args, **kwargs):
self.UseCurrentStyle()
super(Legend, self).Draw(*args, **kwargs)
[docs] def AddEntry(self, thing, label=None, style=None):
"""
Add an entry to the legend.
If `label` is None, `thing.GetTitle()` will be used as the label.
If `style` is None, `thing.legendstyle` is used if present,
otherwise `P`.
"""
if isinstance(thing, HistStack):
things = thing
else:
things = [thing]
for thing in things:
if getattr(thing, 'inlegend', True):
thing_label = thing.GetTitle() if label is None else label
thing_style = getattr(thing, 'legendstyle', 'P') if style is None else style
super(Legend, self).AddEntry(thing, thing_label, thing_style)
keepalive(self, thing)
@property
def primitives(self):
return asrootpy(self.GetListOfPrimitives())