o
    ht                     @   sB  d Z ddlmZ ddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ dd ZG d	d
 d
ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eZdS )'a  
Default legend handlers.

.. important::

    This is a low-level legend API, which most end users do not need.

    We recommend that you are familiar with the :ref:`legend guide
    <legend_guide>` before reading this documentation.

Legend handlers are expected to be a callable object with a following
signature::

    legend_handler(legend, orig_handle, fontsize, handlebox)

Where *legend* is the legend itself, *orig_handle* is the original
plot, *fontsize* is the fontsize in pixels, and *handlebox* is an
`.OffsetBox` instance. Within the call, you should create relevant
artists (using relevant properties from the *legend* and/or
*orig_handle*) and add them into the *handlebox*. The artists need to
be scaled according to the *fontsize* (note that the size is in pixels,
i.e., this is dpi-scaled value).

This module includes definition of several legend handler classes
derived from the base class (HandlerBase) with the following method::

    def legend_artist(self, legend, orig_handle, fontsize, handlebox)
    )cycleN)cbookLine2D)	Rectanglec                 C   s,   t t| d }|d ur| | d S d S N)nextiterget_childrenupdate_from)tgtsrcfirst_child r   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/matplotlib/legend_handler.pyupdate_from_first_child(   s   r   c                   @   sJ   e Zd ZdZdddZdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dS )HandlerBasea  
    A base class for default legend handlers.

    The derived classes are meant to override *create_artists* method, which
    has the following signature::

      def create_artists(self, legend, orig_handle,
                         xdescent, ydescent, width, height, fontsize,
                         trans):

    The overridden method needs to create artists of the given
    transform that fits in the given dimension (xdescent, ydescent,
    width, height) that are scaled by fontsize if necessary.

            Nc                 C   s   ||| _ | _|| _dS )ak  
        Parameters
        ----------
        xpad : float, optional
            Padding in x-direction.
        ypad : float, optional
            Padding in y-direction.
        update_func : callable, optional
            Function for updating the legend handler properties from another
            legend handler, used by `~HandlerBase.update_prop`.
        N)_xpad_ypad_update_prop_func)selfxpadypadupdate_funcr   r   r   __init__>   s   
zHandlerBase.__init__c                 C   s*   | j d u r| || d S |  || d S r   )r   _default_update_propr   legend_handleorig_handler   r   r   _update_propM   s   
zHandlerBase._update_propc                 C   s   | | d S r   )r   r   r   r   r   r   S   s   z HandlerBase._default_update_propc                 C   s.   |  || || |d  |d  d S r   )r    _set_artist_propsset_clip_boxset_clip_pathr   r   r   legendr   r   r   update_propV   s   

zHandlerBase.update_propc                 C   sD   || j |  }|| j|  }|| j |  }|| j|  }||||fS r   )r   r   )r   r%   r   xdescentydescentwidthheightfontsizer   r   r   adjust_drawing_area^   s
   zHandlerBase.adjust_drawing_areac                 C   s^   |  |||j|j|j|j|\}}}}| |||||||| }	|	D ]}
||
 q#|	d S )a.  
        Return the artist that this HandlerBase generates for the given
        original artist/handle.

        Parameters
        ----------
        legend : `~matplotlib.legend.Legend`
            The legend for which these legend artists are being created.
        orig_handle : :class:`matplotlib.artist.Artist` or similar
            The object for which these legend artists are being created.
        fontsize : int
            The fontsize in pixels. The artists being created should
            be scaled according to the given fontsize.
        handlebox : `~matplotlib.offsetbox.OffsetBox`
            The box which has been created to hold this legend entry's
            artists. Artists created in the `legend_artist` method must
            be added to this handlebox inside this method.

        r   )r,   r'   r(   r)   r*   create_artistsget_transform
add_artist)r   r%   r   r+   	handleboxr'   r(   r)   r*   artistsar   r   r   legend_artistg   s   zHandlerBase.legend_artistc	           	      C   s   t d)a  
        Return the legend artists generated.

        Parameters
        ----------
        legend : `~matplotlib.legend.Legend`
            The legend for which these legend artists are being created.
        orig_handle : `~matplotlib.artist.Artist` or similar
            The object for which these legend artists are being created.
        xdescent, ydescent, width, height : int
            The rectangle (*xdescent*, *ydescent*, *width*, *height*) that the
            legend artists being created should fit within.
        fontsize : int
            The fontsize in pixels. The legend artists being created should
            be scaled according to the given fontsize.
        trans : `~matplotlib.transforms.Transform`
            The transform that is applied to the legend artists being created.
            Typically from unit coordinates in the handler box to screen
            coordinates.
        zDerived must override)NotImplementedError)	r   r%   r   r'   r(   r)   r*   r+   transr   r   r   r-      s   zHandlerBase.create_artists)r   r   N)__name__
__module____qualname____doc__r   r    r   r&   r,   r3   r-   r   r   r   r   r   .   s    
	%r   c                       s2   e Zd ZdZd
 fdd	Zdd Zdd	 Z  ZS )HandlerNpointszM
    A legend handler that shows *numpoints* points in the legend entry.
    333333?Nc                    s"   t  jdi | || _|| _dS )a  
        Parameters
        ----------
        marker_pad : float
            Padding between points in legend entry.
        numpoints : int
            Number of points to show in legend entry.
        **kwargs
            Keyword arguments forwarded to `.HandlerBase`.
        Nr   )superr   
_numpoints_marker_pad)r   
marker_pad	numpointskwargs	__class__r   r   r      s   
zHandlerNpoints.__init__c                 C      | j d u r|jS | j S r   )r=   r@   r   r%   r   r   r   get_numpoints      
zHandlerNpoints.get_numpointsc                 C   sn   |  |}|dkr#| j| }t| | | | | |}	|	}
|	|
fS | | | g}	| d|  g}
|	|
fS )N         ?)rF   r>   nplinspace)r   r%   r'   r(   r)   r*   r+   r@   padxdataxdata_markerr   r   r   	get_xdata   s   

zHandlerNpoints.get_xdata)r;   N)r6   r7   r8   r9   r   rF   rO   __classcell__r   r   rB   r   r:      s
    r:   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )HandlerNpointsYoffsetsz
    A legend handler that shows *numpoints* in the legend, and allows them to
    be individually offset in the y-direction.
    Nc                    s    t  jdd|i| || _dS )aL  
        Parameters
        ----------
        numpoints : int
            Number of points to show in legend entry.
        yoffsets : array of floats
            Length *numpoints* list of y offsets for each point in
            legend entry.
        **kwargs
            Keyword arguments forwarded to `.HandlerNpoints`.
        r@   Nr   )r<   r   	_yoffsets)r   r@   yoffsetsrA   rB   r   r   r      s   
zHandlerNpointsYoffsets.__init__c                 C   s,   | j d u r||j }|S |t| j  }|S r   rR   _scatteryoffsetsrJ   asarrayr   r%   r'   r(   r)   r*   r+   ydatar   r   r   	get_ydata   s
   

z HandlerNpointsYoffsets.get_ydataNN)r6   r7   r8   r9   r   rY   rP   r   r   rB   r   rQ      s    rQ   c                   @      e Zd ZdZdd ZdS )HandlerLine2DCompoundz
    Original handler for `.Line2D` instances, that relies on combining
    a line-only with a marker-only artist.  May be deprecated in the future.
    c	                 C   s   |  ||||||\}	}
t|	|| d }t|	|}| ||| |d |d t|
|d t|
 }| ||| |d |j	dkrT|
 |j	 }|| ||_|| || ||gS )N   default NonerH   )rO   rJ   	full_liker   r&   set_drawstyle
set_markerlenset_linestylemarkerscaleget_markersizeset_markersize
_legmarkerset_transform)r   r%   r   r'   r(   r)   r*   r+   r5   rM   rN   rX   leglinelegline_markernewszr   r   r   r-      s$   








z$HandlerLine2DCompound.create_artistsNr6   r7   r8   r9   r-   r   r   r   r   r\      s    r\   c                   @   r[   )HandlerLine2Dz
    Handler for `.Line2D` instances.

    See Also
    --------
    HandlerLine2DCompound : An earlier handler implementation, which used one
                            artist for the line and another for the marker(s).
    c	                 C   s   |  ||||||\}	}
d }| |dkr#t|	d |	d d}	dg}t|	|| d }t|	||d}| ||| |jdkrL| |j }|	| |
| |gS )NrH   r      r]   )	markevery)rO   rF   rJ   rK   ra   r   r&   rf   rg   rh   rj   )r   r%   r   r'   r(   r)   r*   r+   r5   rM   rN   rr   rX   rk   rm   r   r   r   r-     s   



zHandlerLine2D.create_artistsNrn   r   r   r   r   ro     s    	ro   c                       s2   e Zd ZdZd	 fdd	Zdd Zdd Z  ZS )
HandlerPatchz)
    Handler for `.Patch` instances.
    Nc                    s   t  jdi | || _dS )a  
        Parameters
        ----------
        patch_func : callable, optional
            The function that creates the legend key artist.
            *patch_func* should have the signature::

                def patch_func(legend=legend, orig_handle=orig_handle,
                               xdescent=xdescent, ydescent=ydescent,
                               width=width, height=height, fontsize=fontsize)

            Subsequently, the created artist will have its ``update_prop``
            method called and the appropriate transform will be applied.

        **kwargs
            Keyword arguments forwarded to `.HandlerBase`.
        Nr   )r<   r   _patch_func)r   
patch_funcrA   rB   r   r   r   ?  s   
zHandlerPatch.__init__c           	   	   C   s@   | j d u rt| | f||d}|S | j |||||||d}|S )Nxyr)   r*   )r%   r   r'   r(   r)   r*   r+   )rt   r   )	r   r%   r   r'   r(   r)   r*   r+   pr   r   r   _create_patchT  s   
zHandlerPatch._create_patchc	           
   	   C   s4   |  |||||||}	| |	|| |	| |	gS r   )ry   r&   rj   
r   r%   r   r'   r(   r)   r*   r+   r5   rx   r   r   r   r-   _  s   

zHandlerPatch.create_artistsr   )r6   r7   r8   r9   r   ry   r-   rP   r   r   rB   r   rs   :  s
    rs   c                   @   s0   e Zd ZdZedd Zedd Zdd ZdS )	HandlerStepPatchzA
    Handler for `~.matplotlib.patches.StepPatch` instances.
    c                 C   s   t | | f|||  dS )N)rw   r)   r*   color)r   get_facecolor)r   r'   r(   r)   r*   r   r   r   ry   n  s   zHandlerStepPatch._create_patchc                 C   sF   t d|g|d |d g|  |  |  d}|d |d |S )Nr   r]   )r|   	linestyle	linewidthr^   r_   )r   get_edgecolorget_linestyleget_linewidthrb   rc   )r   r)   r*   rk   r   r   r   _create_lines  s   

zHandlerStepPatch._create_linec	           
      C   sT   |  s
| d ur| |||||}	| |	|| n| |||}	|	| |	gS r   )get_fill	get_hatchry   r&   r   rj   rz   r   r   r   r-     s   
zHandlerStepPatch.create_artistsN)r6   r7   r8   r9   staticmethodry   r   r-   r   r   r   r   r{   i  s    

r{   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	HandlerLineCollectionz2
    Handler for `.LineCollection` instances.
    c                 C   rD   r   r=   scatterpointsrE   r   r   r   rF     rG   z#HandlerLineCollection.get_numpointsc                 C   sD   |  d }|jd }| d }|| || || d S Nr   )get_linewidths_us_linestyles
get_colors	set_colorre   set_linewidth)r   r   r   lwdashesr|   r   r   r   r     s   


z*HandlerLineCollection._default_update_propc	                 C   sT   |  ||||||\}	}
t|	|| d }t|	|}| ||| || |gS )Nr]   )rO   rJ   ra   r   r&   rj   )r   r%   r   r'   r(   r)   r*   r+   r5   rM   rN   rX   rk   r   r   r   r-     s   


z$HandlerLineCollection.create_artistsN)r6   r7   r8   r9   rF   r   r-   r   r   r   r   r     s
    r   c                       sJ   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )HandlerRegularPolyCollectionz'Handler for `.RegularPolyCollection`\s.Nc                    s    t  jdd|i| || _d S )NrS   r   )r<   r   _sizes)r   rS   sizesrA   rB   r   r   r     s   
z%HandlerRegularPolyCollection.__init__c                 C   rD   r   r   rE   r   r   r   rF     rG   z*HandlerRegularPolyCollection.get_numpointsc                 C   s   | j d u rK| }t|sdg}t||jd  }	t||jd  }
| |}|dk r:d|	|
  |	|
gd | }|S |	|
 }|tdd| |
 }|S | j }|S )NrH   r]      rI   r   )	r   	get_sizesrd   maxrf   minrF   rJ   rK   )r   r%   r   r'   r(   r)   r*   r+   handle_sizessize_maxsize_minr@   r   rngr   r   r   r     s&   

z&HandlerRegularPolyCollection.get_sizesc                 C   s6   |  || ||jdd |d  |d  d S )NF)root)r    
set_figure
get_figurer"   r#   r$   r   r   r   r&     s   
z(HandlerRegularPolyCollection.update_propc                 C   s   t || | |||dS )N)rotationr   offsetsoffset_transform)typeget_numsidesget_rotationr   r   r   r   r   r   r   r   create_collection  s
   z.HandlerRegularPolyCollection.create_collectionc	              	   C   s|   |  ||||||\}	}
| ||||||}| |||||||}| j||tt|
||d}| ||| || |gS N)r   r   )rO   rY   r   r   listzipr&   set_offset_transform)r   r%   r   r'   r(   r)   r*   r+   r5   rM   rN   rX   r   rx   r   r   r   r-     s    


z+HandlerRegularPolyCollection.create_artistsrZ   )r6   r7   r8   r9   r   rF   r   r&   r   r-   rP   r   r   rB   r   r     s    	r   c                   @   r[   )HandlerPathCollectionzDHandler for `.PathCollection`\s, which are used by `~.Axes.scatter`.c                 C   s   t || d g|||dS )Nr   )r   r   r   )r   	get_pathsr   r   r   r   r     s   z'HandlerPathCollection.create_collectionNr6   r7   r8   r9   r   r   r   r   r   r         r   c                   @   r[   )HandlerCircleCollectionz"Handler for `.CircleCollection`\s.c                 C   s   t ||||dS r   )r   r   r   r   r   r     s   z)HandlerCircleCollection.create_collectionNr   r   r   r   r   r     r   r   c                       s6   e Zd ZdZ		d fdd	Zdd Zd	d
 Z  ZS )HandlerErrorbarzHandler for Errorbars.rI   Nr;   c                    s(   || _ || _t jd||d| d S )N)r?   r@   r   )
_xerr_size
_yerr_sizer<   r   )r   	xerr_size	yerr_sizer?   r@   rA   rB   r   r   r     s   zHandlerErrorbar.__init__c           	      C   s2   | j | }| jd u r|}||fS | j| }||fS r   )r   r   )	r   r%   r'   r(   r)   r*   r+   r   r   r   r   r   get_err_size  s   


zHandlerErrorbar.get_err_sizec	                    s  |\}	}
}|  ||||||\}}t||| d }t||}t|}t|d t| }| ||||||\ t||}|	d u rP|d |d n.| ||	| |	d |
d | ||	| |d |jdkr~| |j }|| g }g }|jrڇ fddt||D }t|}| ||d	 | || |
rt|  |}t|  |}| ||
d	 | | ||
d	 | |
d
 |
d
 || || |jr4fddt||D }t|}| ||d	 | || |
r4t|| }t|| }| ||
d	 | | ||
d	 | |
d |
d || || g ||||}|D ]}|| q@|S )Nr]   Fr^   noner`   rH   c                    s(   g | ]\}}|  |f|  |ffqS r   r   .0xy)r   r   r   
<listcomp>I      z2HandlerErrorbar.create_artists.<locals>.<listcomp>r   |c                    s(   g | ]\}}||  f||  ffqS r   r   r   )r   r   r   r   [  r   _)rO   rJ   ra   r   rV   rd   r   set_visibler&   rb   rc   re   rf   rg   rh   has_xerrr   mcollLineCollectionappendhas_yerrrj   )r   r%   r   r'   r(   r)   r*   r+   r5   	plotlinescaplinesbarlinecolsrM   rN   rX   rk   ydata_markerrl   rm   handle_barlinecolshandle_caplinesvertscollcapline_leftcapline_rightr1   artistr   )r   r   r   r-     s   

























zHandlerErrorbar.create_artists)rI   Nr;   N)r6   r7   r8   r9   r   r   r-   rP   r   r   rB   r   r   	  s    r   c                       s>   e Zd ZdZ		d fdd	Zdd Zdd	 Zd
d Z  ZS )HandlerStemz6
    Handler for plots produced by `~.Axes.stem`.
    r;   Nc                    s$   t  jd|||d| || _dS )a  
        Parameters
        ----------
        marker_pad : float, default: 0.3
            Padding between points in legend entry.
        numpoints : int, optional
            Number of points to show in legend entry.
        bottom : float, optional

        yoffsets : array of floats, optional
            Length *numpoints* list of y offsets for each point in
            legend entry.
        **kwargs
            Keyword arguments forwarded to `.HandlerNpointsYoffsets`.
        )r?   r@   rS   Nr   )r<   r   _bottom)r   r?   r@   bottomrS   rA   rB   r   r   r   y  s   
zHandlerStem.__init__c                 C   s4   | j d u r|d|j d  }|S |t| j  }|S )NrI   rT   rW   r   r   r   rY     s
   
zHandlerStem.get_ydatac	                    sX  |\}	}
}t |
tj}| ||||||\}}| ||||||}| jd u r)d n| j t||d t| }| ||	|  fddt	||D }|rqt
j| | jd |D ]	}| ||
| qWW d    n1 skw   Y  nt	||
D ]\}}| ||| qvtt|t|g  g}| ||| g |||}|D ]}|| q|S )Nr   c                    s"   g | ]\}}t ||g |gqS r   r   r   r   r   r   r     s    z.HandlerStem.create_artists.<locals>.<listcomp>)r   )
isinstancer   r   rO   rY   r   r   rd   r&   r   r   _setattr_cm_copy_collection_propsrJ   r   r   rj   )r   r%   r   r'   r(   r)   r*   r+   r5   
markerline	stemlinesbaselineusing_linecollrM   rN   rX   leg_markerlineleg_stemlineslinelmmleg_baseliner1   r   r   r   r   r-     sF   




zHandlerStem.create_artistsc                 C   s(   | | d  || d  dS )zt
        Copy properties from the `.LineCollection` *orig_handle* to the
        `.Line2D` *legend_handle*.
        r   N)r   	get_colorre   r   r   r   r   r   r     s   z"HandlerStem._copy_collection_props)r;   NNN)	r6   r7   r8   r9   r   rY   r-   r   rP   r   r   rB   r   r   t  s    0r   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )	HandlerTuplez
    Handler for Tuple.
    rH   Nc                    s"   || _ || _t jdi | dS )a  
        Parameters
        ----------
        ndivide : int or None, default: 1
            The number of sections to divide the legend area into.  If None,
            use the length of the input tuple.
        pad : float, default: :rc:`legend.borderpad`
            Padding in units of fraction of font size.
        **kwargs
            Keyword arguments forwarded to `.HandlerBase`.
        Nr   )_ndivide_padr<   r   )r   ndividerL   rA   rB   r   r   r     s   zHandlerTuple.__init__c	                 C   s   |  }	| jd u rt|}
n| j}
| jd u r|j| }n| j| }|
dkr/|||
d   |
 }t||| t|
  }g }|D ]}||	|}|	||t
||||||}|| q@|S )NrH   )get_legend_handler_mapr   rd   r   	borderpadr   rJ   arangeget_legend_handlerr-   r   extend)r   r%   r   r'   r(   r)   r*   r+   r5   handler_mapr   rL   	xds_cyclea_listhandle1handler_a_listr   r   r   r-     s&   



zHandlerTuple.create_artists)rH   N)r6   r7   r8   r9   r   r-   rP   r   r   rB   r   r     s    r   c                   @   s    e Zd ZdZdd Zdd ZdS )HandlerPolyCollectionza
    Handler for `.PolyCollection` used in `~.Axes.fill_between` and
    `~.Axes.stackplot`.
    c                 C   s   dd }dd }||  |_|| |_|j|_|j|_| |_| |_	|j
|_
|||  |||  |||  ||  d S )Nc                 S   s   | j dkrdS t| d S )Nr   )r   r   r   r   )sizetuple)colorsr   r   r   first_color
  s   
z7HandlerPolyCollection._update_prop.<locals>.first_colorc                 S   s   t | r| d S d S r   )rd   )
prop_arrayr   r   r   	get_first  s   z5HandlerPolyCollection._update_prop.<locals>.get_first)r}   
_facecolorr   
_edgecolor_original_facecolor_original_edgecolorr   _fillr   _hatch_hatch_colorr   r   re   get_linestylesrj   get_transformsr   r   )r   r   r   r   r   r   r   r   r    	  s   

z"HandlerPolyCollection._update_propc	           
      C   s4   t | | f||d}	| |	|| |	| |	gS )Nrv   )r   r&   rj   rz   r   r   r   r-   &  s   
z$HandlerPolyCollection.create_artistsN)r6   r7   r8   r9   r    r-   r   r   r   r   r     s    r   )r9   	itertoolsr   numpyrJ   
matplotlibr   matplotlib.linesr   matplotlib.patchesr   matplotlib.collectionscollectionsr   r   r   r:   rQ   r\   ro   rs   r{   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s.    x*%'/% I
k[5