11"""
2- This module defines default legend handlers.
2+ This module defines default legend handlers.
33
44Legend handlers are expected to be a callable object with a following
55signature. ::
@@ -124,14 +124,12 @@ def create_artists(self, legend, orig_handle,
124124 raise NotImplementedError ('Derived must override' )
125125
126126
127- class HandlerLine2D (HandlerBase ):
128- """
129- Handler for Line2D instances
130- """
127+ class HandlerNpoints (HandlerBase ):
131128 def __init__ (self , marker_pad = 0.3 , numpoints = None , ** kw ):
132129 HandlerBase .__init__ (self , ** kw )
133- self . _marker_pad = marker_pad
130+
134131 self ._numpoints = numpoints
132+ self ._marker_pad = marker_pad
135133
136134 def get_numpoints (self , legend ):
137135 if self ._numpoints is None :
@@ -157,6 +155,31 @@ def get_xdata(self, legend, xdescent, ydescent, width, height, fontsize):
157155
158156
159157
158+ class HandlerNpointsYoffsets (HandlerNpoints ):
159+ def __init__ (self , numpoints = None , yoffsets = None , ** kw ):
160+ HandlerNpoints .__init__ (self ,numpoints = numpoints , ** kw )
161+ self ._yoffsets = yoffsets
162+
163+ def get_ydata (self , legend , xdescent , ydescent , width , height , fontsize ):
164+ if self ._yoffsets is None :
165+ ydata = height * legend ._scatteryoffsets
166+ else :
167+ ydata = height * np .asarray (self ._yoffsets )
168+
169+ return ydata
170+
171+
172+
173+
174+
175+ class HandlerLine2D (HandlerNpoints ):
176+ """
177+ Handler for Line2D instances
178+ """
179+ def __init__ (self , marker_pad = 0.3 , numpoints = None , ** kw ):
180+ HandlerNpoints .__init__ (self , marker_pad = marker_pad , numpoints = numpoints , ** kw )
181+
182+
160183 def create_artists (self , legend , orig_handle ,
161184 xdescent , ydescent , width , height , fontsize ,
162185 trans ):
@@ -263,14 +286,13 @@ def create_artists(self, legend, orig_handle,
263286
264287
265288
266- class HandlerRegularPolyCollection (HandlerLine2D ):
289+ class HandlerRegularPolyCollection (HandlerNpointsYoffsets ):
267290 """
268291 Handler for RegularPolyCollections.
269292 """
270- def __init__ (self , scatteryoffsets = None , sizes = None , ** kw ):
271- HandlerLine2D .__init__ (self , ** kw )
293+ def __init__ (self , yoffsets = None , sizes = None , ** kw ):
294+ HandlerNpointsYoffsets .__init__ (self , yoffsets = yoffsets , ** kw )
272295
273- self ._scatteryoffsets = scatteryoffsets
274296 self ._sizes = sizes
275297
276298 def get_numpoints (self , legend ):
@@ -279,14 +301,6 @@ def get_numpoints(self, legend):
279301 else :
280302 return self ._numpoints
281303
282- def get_ydata (self , legend , xdescent , ydescent , width , height , fontsize ):
283- if self ._scatteryoffsets is None :
284- ydata = height * legend ._scatteryoffsets
285- else :
286- ydata = height * np .asarray (self ._scatteryoffsets )
287-
288- return ydata
289-
290304 def get_sizes (self , legend , orig_handle ,
291305 xdescent , ydescent , width , height , fontsize ):
292306 if self ._sizes is None :
@@ -467,6 +481,73 @@ def create_artists(self, legend, orig_handle,
467481
468482
469483
484+ class HandlerStem (HandlerNpointsYoffsets ):
485+ """
486+ Handler for Errorbars
487+ """
488+ def __init__ (self , marker_pad = 0.3 , numpoints = None ,
489+ bottom = None , yoffsets = None , ** kw ):
490+
491+ HandlerNpointsYoffsets .__init__ (self , marker_pad = marker_pad ,
492+ numpoints = numpoints ,
493+ yoffsets = yoffsets ,
494+ ** kw )
495+
496+ self ._bottom = bottom
497+
498+
499+ def get_ydata (self , legend , xdescent , ydescent , width , height , fontsize ):
500+ if self ._yoffsets is None :
501+ ydata = height * (0.5 * legend ._scatteryoffsets + 0.5 )
502+ else :
503+ ydata = height * np .asarray (self ._yoffsets )
504+
505+ return ydata
506+
507+
508+ def create_artists (self , legend , orig_handle ,
509+ xdescent , ydescent , width , height , fontsize ,
510+ trans ):
511+
512+ markerline , stemlines , baseline = orig_handle
513+
514+ xdata , xdata_marker = self .get_xdata (legend , xdescent , ydescent ,
515+ width , height , fontsize )
516+
517+ ydata = self .get_ydata (legend , xdescent , ydescent ,
518+ width , height , fontsize )
519+
520+ if self ._bottom is None :
521+ bottom = 0.
522+ else :
523+ bottom = self ._bottom
524+
525+ ax = markerline .axes
526+ #saved_dict = self.pre_plot_commands(ax)
527+
528+ leg_markerline = Line2D (xdata_marker , ydata [:len (xdata_marker )])
529+ self .update_prop (leg_markerline , markerline , legend )
530+
531+ leg_stemlines = []
532+ for thisx , thisy in zip (xdata_marker , ydata ):
533+ l = Line2D ([thisx ,thisx ], [bottom , thisy ])
534+ leg_stemlines .append (l )
535+
536+ for lm , m in zip (leg_stemlines , stemlines ):
537+ self .update_prop (lm , m , legend )
538+
539+ leg_baseline = Line2D ([np .amin (xdata ), np .amax (xdata )],
540+ [bottom , bottom ])
541+
542+ self .update_prop (leg_baseline , baseline , legend )
543+
544+ artists = [leg_markerline ]
545+ artists .extend (leg_stemlines )
546+ artists .append (leg_baseline )
547+
548+ return artists
549+
550+
470551class HandlerTuple (HandlerBase ):
471552 """
472553 Handler for Tuple
0 commit comments