o
    hZt                     @   s   d Z ddlZddlZddlmZ ddlZddlZddlm	Z	m
Z
mZ ddlmZ eeZG dd dZG dd	 d	eZG d
d deZG dd dZG dd dZdS )a  
:mod:`~matplotlib.gridspec` contains classes that help to layout multiple
`~.axes.Axes` in a grid-like pattern within a figure.

The `GridSpec` specifies the overall grid structure. Individual cells within
the grid are referenced by `SubplotSpec`\s.

Often, users need not access this module directly, and can use higher-level
methods like `~.pyplot.subplots`, `~.pyplot.subplot_mosaic` and
`~.Figure.subfigures`. See the tutorial :ref:`arranging_axes` for a guide.
    N)Integral)_api_pylab_helpers_tight_layout)Bboxc                   @   s   e Zd ZdZd'ddZdd Zedd d	d
Zedd dd
Zdd Z	d(ddZ
d)ddZdd Zdd Zdd Zdd Zdd Zedd Zd d! Zd"d"d#dd$d%d&ZdS )*GridSpecBasezm
    A base class of GridSpec that specifies the geometry of the grid
    that a subplot will be placed.
    Nc                 C   sf   t |tr	|dkrtd|t |tr|dkr td|||| _| _| | | | dS )a  
        Parameters
        ----------
        nrows, ncols : int
            The number of rows and columns of the grid.
        width_ratios : array-like of length *ncols*, optional
            Defines the relative widths of the columns. Each column gets a
            relative width of ``width_ratios[i] / sum(width_ratios)``.
            If not given, all columns will have the same width.
        height_ratios : array-like of length *nrows*, optional
            Defines the relative heights of the rows. Each row gets a
            relative height of ``height_ratios[i] / sum(height_ratios)``.
            If not given, all rows will have the same height.
        r   z/Number of rows must be a positive integer, not z2Number of columns must be a positive integer, not N)
isinstancer   
ValueError_nrows_ncolsset_height_ratiosset_width_ratios)selfnrowsncolsheight_ratioswidth_ratios r   g/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/matplotlib/gridspec.py__init__    s   
zGridSpecBase.__init__c                 C   sb   t t| jdkrd| jnd}t t| jdkr d| jnd}dj| jj| j| j|| dS )N   z, height_ratios= z, width_ratios=z&{clsname}({nrows}, {ncols}{optionals}))clsnamer   r   	optionals)	lenset_row_height_ratios_col_width_ratiosformat	__class____name__r
   r   )r   
height_arg	width_argr   r   r   __repr__9   s   zGridSpecBase.__repr__c                 C      | j S N)r
   r   r   r   r   <lambda>E       zGridSpecBase.<lambda>zThe number of rows in the grid.)docc                 C   r$   r%   )r   r&   r   r   r   r'   G   r(   z"The number of columns in the grid.c                 C   s   | j | jfS )zW
        Return a tuple containing the number of rows and columns in the grid.
        )r
   r   r&   r   r   r   get_geometryJ   s   zGridSpecBase.get_geometryc                 C   s   d S r%   r   )r   figurer   r   r   get_subplot_paramsP   s   zGridSpecBase.get_subplot_paramsr   c                 C   s(   |\}}| ||| ||| f }|S )a[  
        Create and return a `.SubplotSpec` instance.

        Parameters
        ----------
        loc : (int, int)
            The position of the subplot in the grid as
            ``(row_index, column_index)``.
        rowspan, colspan : int, default: 1
            The number of rows and columns the subplot should span in the grid.
        r   )r   locrowspancolspanloc1loc2subplotspecr   r   r   new_subplotspecT   s   zGridSpecBase.new_subplotspecc                 C   6   |du rdg| j  }nt|| j krtd|| _dS )z
        Set the relative widths of the columns.

        *width_ratios* must be of length *ncols*. Each column gets a relative
        width of ``width_ratios[i] / sum(width_ratios)``.
        Nr   zTExpected the given number of width ratios to match the number of columns of the grid)r   r   r	   r   )r   r   r   r   r   r   d   
   
zGridSpecBase.set_width_ratiosc                 C   r$   )zo
        Return the width ratios.

        This is *None* if no width ratios have been set explicitly.
        )r   r&   r   r   r   get_width_ratiosr      zGridSpecBase.get_width_ratiosc                 C   r4   )z
        Set the relative heights of the rows.

        *height_ratios* must be of length *nrows*. Each row gets a relative
        height of ``height_ratios[i] / sum(height_ratios)``.
        Nr   zRExpected the given number of height ratios to match the number of rows of the grid)r
   r   r	   r   )r   r   r   r   r   r   z   r5   zGridSpecBase.set_height_ratiosc                 C   r$   )zq
        Return the height ratios.

        This is *None* if no height ratios have been set explicitly.
        )r   r&   r   r   r   get_height_ratios   r7   zGridSpecBase.get_height_ratiosc                    sV  |   \}}| |}|j}|j}|j}|j}|j}	|j}
|| }|| }|||
|d    }|
| }|| t| j	   fdd| j	D }dg|g|d   }t
t
||gj}|||	|d    }|	| }|| t| j   fdd| jD }dg|g|d   }t
t
||gj}|| dj\}}|| dj\}}||||fS )a  
        Return the positions of the grid cells in figure coordinates.

        Parameters
        ----------
        fig : `~matplotlib.figure.Figure`
            The figure the grid should be applied to. The subplot parameters
            (margins and spacing between subplots) are taken from *fig*.

        Returns
        -------
        bottoms, tops, lefts, rights : array
            The bottom, top, left, right positions of the grid cells in
            figure coordinates.
        r   c                       g | ]}|  qS r   r   .0rnormr   r   
<listcomp>       z3GridSpecBase.get_grid_positions.<locals>.<listcomp>r   c                    r9   r   r   r:   r=   r   r   r?      r@   )   )r*   r,   leftrightbottomtopwspacehspacesumr   npcumsumcolumn_stackflatr   reshapeT)r   figr   r   subplot_paramsrC   rD   rE   rF   rG   rH   	tot_width
tot_heightcell_hsep_hcell_heightssep_heightscell_hscell_wsep_wcell_widths
sep_widthscell_wsfig_topsfig_bottoms	fig_lefts
fig_rightsr   r=   r   get_grid_positions   s2   
zGridSpecBase.get_grid_positionsc                 C   sZ   |   D ]!}| }|dur%t|dr|  }| ||fkr%|  S qt||| dS )zo
        Check if the figure already has a gridspec with these dimensions,
        or create a new one
        Nget_topmost_subplotspecr+   )get_axesget_gridspechasattrrc   r*   GridSpec)r+   r   r   axgsr   r   r   _check_gridspec_exists   s   
z#GridSpecBase._check_gridspec_existsc           
   
   C   s   |   \}}dd }t|tr<z|\}}W n ty& } ztd|d}~ww t|||d|||dg||f\}}	n
|||| d\}}	t| ||	S )z,Create and return a `.SubplotSpec` instance.c                 S   s   | }t | tr| |\}}}||kr||d fS td| dk r%| | } d|   kr2|k r3| | fS  |d urDtd| d| d| td| d| )Nr   z=GridSpec slice would result in no space allocated for subplotr   zindex z is out of bounds for axis z with size z) is out of bounds for GridSpec with size )r   sliceindices
IndexError)keysizeaxisorig_keystartstop_r   r   r   
_normalize   s(   


z,GridSpecBase.__getitem__.<locals>._normalizezUnrecognized subplot specNr   r   )r*   r   tupler	   rJ   ravel_multi_indexSubplotSpec)
r   ro   r   r   rv   k1k2errnum1num2r   r   r   __getitem__   s   


zGridSpecBase.__getitem__FT)sharexshareysqueeze
subplot_kwc                C   s^  | j }|du rtdt|ts|rdnd}t|ts!|rdnd}tjg d||d |du r1i }| }tj| j	| j
ftd}t| j	D ]8}t| j
D ]0}d|d ||d	f |d	|f d
}	|	| |d< |	| |d< |j| ||f fi ||||f< qLqE|dv r|jD ]}
|
jdd q|dv r|jD ]}
|
jdd q|r|jdkr| S | S |S )z
        Add all subplots specified by this `GridSpec` to its parent figure.

        See `.Figure.subplots` for detailed documentation.
        NzIGridSpec.subplots() only works for GridSpecs created with a parent figureallnone)r   rowcolr   FT)r   r   )dtype)r   r   r   )r   r   r   r   r   r   )r   r   T)skip_non_rectangular_axes)r   r   r   )r+   r	   r   strr   check_in_listcopyrJ   emptyr
   r   objectrangeadd_subplotrM   _label_outer_xaxis_label_outer_yaxisrp   itemr   )r   r   r   r   r   r+   axarrr   r   shared_withri   r   r   r   subplots   sH   



	

zGridSpecBase.subplots)NNr%   )r   r   )r    
__module____qualname____doc__r   r#   propertyr   r   r*   r,   r3   r   r6   r   r8   rb   staticmethodrk   r   r   r   r   r   r   r      s0    


/
%r   c                       sZ   e Zd ZdZ				d fdd	Zg dZdd Zddd	Zd
d Z		dddZ	  Z
S )rh   a  
    A grid layout to place subplots within a figure.

    The location of the grid cells is determined in a similar way to
    `.SubplotParams` using *left*, *right*, *top*, *bottom*, *wspace*
    and *hspace*.

    Indexing a GridSpec instance returns a `.SubplotSpec`.
    Nc                    sB   || _ || _|| _|| _|| _|	| _|| _t j|||
|d dS )a  
        Parameters
        ----------
        nrows, ncols : int
            The number of rows and columns of the grid.

        figure : `.Figure`, optional
            Only used for constrained layout to create a proper layoutgrid.

        left, right, top, bottom : float, optional
            Extent of the subplots as a fraction of figure width or height.
            Left cannot be larger than right, and bottom cannot be larger than
            top. If not given, the values will be inferred from a figure or
            rcParams at draw time. See also `GridSpec.get_subplot_params`.

        wspace : float, optional
            The amount of width reserved for space between subplots,
            expressed as a fraction of the average axis width.
            If not given, the values will be inferred from a figure or
            rcParams when necessary. See also `GridSpec.get_subplot_params`.

        hspace : float, optional
            The amount of height reserved for space between subplots,
            expressed as a fraction of the average axis height.
            If not given, the values will be inferred from a figure or
            rcParams when necessary. See also `GridSpec.get_subplot_params`.

        width_ratios : array-like of length *ncols*, optional
            Defines the relative widths of the columns. Each column gets a
            relative width of ``width_ratios[i] / sum(width_ratios)``.
            If not given, all columns will have the same width.

        height_ratios : array-like of length *nrows*, optional
            Defines the relative heights of the rows. Each row gets a
            relative height of ``height_ratios[i] / sum(height_ratios)``.
            If not given, all rows will have the same height.

        r   r   N)	rC   rE   rD   rF   rG   rH   r+   superr   )r   r   r   r+   rC   rE   rD   rF   rG   rH   r   r   r   r   r   r   9  s   *

zGridSpec.__init__rC   rE   rD   rF   rG   rH   c                 K   s   |  D ]\}}|| jv rt| || qt| dtjj D ],}|jj	j
D ]$}| durL|  }| | krL|jdd}|| | q(q!dS )a  
        Update the subplot parameters of the grid.

        Parameters that are not explicitly given are not changed. Setting a
        parameter to *None* resets it to :rc:`figure.subplot.*`.

        Parameters
        ----------
        left, right, top, bottom : float or None, optional
            Extent of the subplots as a fraction of figure width or height.
        wspace, hspace : float, optional
            Spacing between the subplots as a fraction of the average subplot
            width / height.
        z is an unknown keywordNF)root)items_AllowedKeyssetattrAttributeErrorr   Gcffigsvaluescanvasr+   axesget_subplotspecrc   rf   
get_figure_set_positionget_position)r   kwargskv
figmanagerri   ssrP   r   r   r   updateq  s   
zGridSpec.updatec                    sX   |du rdd  j D }tdi |}nt|j}|jdi  fdd j D  |S )a:  
        Return the `.SubplotParams` for the GridSpec.

        In order of precedence the values are taken from

        - non-*None* attributes of the GridSpec
        - the provided *figure*
        - :rc:`figure.subplot.*`

        Note that the ``figure`` attribute of the GridSpec is always ignored.
        Nc                 S   s   i | ]
}|t jd |  qS )figure.subplot.)mplrcParamsr;   r   r   r   r   
<dictcomp>  s    z/GridSpec.get_subplot_params.<locals>.<dictcomp>c                    s   i | ]}|t  |qS r   getattrr   r&   r   r   r     s    r   )r   SubplotParamsr   subplotparsr   )r   r+   kwr   r   r&   r   r,     s    zGridSpec.get_subplot_paramsc                    s    fdd j D S )z
        Return a list of the names of the subplot parameters explicitly set
        in the GridSpec.

        This is a subset of the attributes of `.SubplotParams`.
        c                    s   g | ]	}t  |r|qS r   r   r   r&   r   r   r?     s    z<GridSpec.locally_modified_subplot_params.<locals>.<listcomp>)r   r&   r   r&   r   locally_modified_subplot_params  s   z(GridSpec.locally_modified_subplot_paramsHzG?c              
   C   sT   |du r|  }tj||jtj|j| d|||||d}|r(| jdi | dS dS )a  
        Adjust subplot parameters to give specified padding.

        Parameters
        ----------
        figure : `.Figure`
            The figure.
        renderer :  `.RendererBase` subclass, optional
            The renderer to be used.
        pad : float
            Padding between the figure edge and the edges of subplots, as a
            fraction of the font-size.
        h_pad, w_pad : float, optional
            Padding (height/width) between edges of adjacent subplots.
            Defaults to *pad*.
        rect : tuple (left, bottom, right, top), default: None
            (left, bottom, right, top) rectangle in normalized figure
            coordinates that the whole subplots area (including labels) will
            fit into. Default (None) is the whole figure.
        N)	grid_spec)padh_padw_padrectr   )_get_rendererr   get_tight_layout_figurer   get_subplotspec_listr   )r   r+   rendererr   r   r   r   r   r   r   r   tight_layout  s   
zGridSpec.tight_layout)	NNNNNNNNNr%   )Nr   NNN)r    r   r   r   r   r   r   r,   r   r   __classcell__r   r   r   r   rh   /  s    	6
	rh   c                       s8   e Zd ZdZ		d	 fdd	Zd
ddZdd Z  ZS )GridSpecFromSubplotSpeczx
    GridSpec whose subplot layout parameters are inherited from the
    location specified by a given SubplotSpec.
    Nc                    sL   || _ || _t|tr|| _ntd| j j| _t j	||||d dS )ak  
        Parameters
        ----------
        nrows, ncols : int
            Number of rows and number of columns of the grid.
        subplot_spec : SubplotSpec
            Spec from which the layout parameters are inherited.
        wspace, hspace : float, optional
            See `GridSpec` for more details. If not specified default values
            (from the figure or rcParams) are used.
        height_ratios : array-like of length *nrows*, optional
            See `GridSpecBase` for details.
        width_ratios : array-like of length *ncols*, optional
            See `GridSpecBase` for details.
        zVsubplot_spec must be type SubplotSpec, usually from GridSpec, or axes.get_subplotspec.r   N)
_wspace_hspacer   ry   _subplot_spec	TypeErrorrf   r+   r   r   )r   r   r   subplot_specrG   rH   r   r   r   r   r   r     s   


z GridSpecFromSubplotSpec.__init__c           	      C   s   | j dur| j n|dur|jjntjd }| jdur| jn|dur%|jjntjd }| j|}|j	\}}}}t
||||||dS )z1Return a dictionary of subplot layout parameters.Nzfigure.subplot.hspacezfigure.subplot.wspace)rC   rD   rE   rF   rG   rH   )r   r   rH   r   r   r   rG   r   r   extentsr   )	r   r+   rH   rG   figboxrC   rE   rD   rF   r   r   r   r,     s   z*GridSpecFromSubplotSpec.get_subplot_paramsc                 C   s
   | j  S )zY
        Return the topmost `.SubplotSpec` instance associated with the subplot.
        )r   rc   r&   r   r   r   rc     s   
z/GridSpecFromSubplotSpec.get_topmost_subplotspec)NNNNr%   )r    r   r   r   r   r,   rc   r   r   r   r   r   r     s    
 r   c                   @   s   e Zd ZdZd&ddZdd Zedd Zed	d
 Z	e	j
dd
 Z	dd Zdd Zedd Zedd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% ZdS )'ry   a]  
    The location of a subplot in a `GridSpec`.

    .. note::

        Likely, you will never instantiate a `SubplotSpec` yourself. Instead,
        you will typically obtain one from a `GridSpec` using item-access.

    Parameters
    ----------
    gridspec : `~matplotlib.gridspec.GridSpec`
        The GridSpec, which the subplot is referencing.
    num1, num2 : int
        The subplot will occupy the *num1*-th cell of the given
        *gridspec*.  If *num2* is provided, the subplot will span between
        *num1*-th cell and *num2*-th cell **inclusive**.

        The index starts from 0.
    Nc                 C   s   || _ || _|| _d S r%   )	_gridspecr}   r~   )r   gridspecr}   r~   r   r   r   r     s   
zSubplotSpec.__init__c              
   C   s6   |    d| jj d| jj d| jj d| jj d
S )N[:z, ])rf   r.   rs   rt   r/   r&   r   r   r   r#   "  s   
zSubplotSpec.__repr__c           	      C   sN  t |dkr8|\}t|tr|S t|tstd|zttt|\}}}W n% ty7   td|dw t |dkrD|\}}}n
tj	ddt |dt
| ||}|du r`t
||| d}t|trt |d	krtd
d |D s{td| |\}}nt|tr|dk s||| krtd||  d|| }}||d | S )z
        Construct a `.SubplotSpec` from a parent `.Figure` and either

        - a `.SubplotSpec` -- returned as is;
        - one or three numbers -- a MATLAB-style subplot specifier.
        r   z>Single argument to subplot must be a three-digit integer, not N   subplotz1 or 3)takesgivenrd   rB   c                 s   s    | ]}t |tV  qd S r%   )r   r   )r;   nr   r   r   	<genexpr>F  s    z1SubplotSpec._from_subplot_args.<locals>.<genexpr>z3Subplot specifier tuple must contain integers, not z(num must be an integer with 1 <= num <= z, not )r   r   ry   r   r	   mapintr   r   nargs_errorrh   rk   rw   r   )	r+   argsargrowscolsnumrj   ijr   r   r   _from_subplot_args'  sR   


zSubplotSpec._from_subplot_argsc                 C   s   | j d u r| jS | j S r%   )_num2r}   r&   r   r   r   r~   W  s   zSubplotSpec.num2c                 C   s
   || _ d S r%   )r   )r   valuer   r   r   r~   [  s   
c                 C   r$   r%   )r   r&   r   r   r   rf   _  s   zSubplotSpec.get_gridspecc                 C   s    |    \}}||| j| jfS )a  
        Return the subplot geometry as tuple ``(n_rows, n_cols, start, stop)``.

        The indices *start* and *stop* define the range of the subplot within
        the `GridSpec`. *stop* is inclusive (i.e. for a single cell
        ``start == stop``).
        )rf   r*   r}   r~   )r   r   r   r   r   r   r*   b  s   zSubplotSpec.get_geometryc                 C   s$   |   j}t| j| | j| d S )z6The rows spanned by this subplot, as a `range` object.r   )rf   r   r   r}   r~   )r   r   r   r   r   r.   m  s   
zSubplotSpec.rowspanc                 C   s4   |   j}t| j| | j| g\}}t||d S )z9The columns spanned by this subplot, as a `range` object.r   )rf   r   sortedr}   r~   r   )r   r   c1c2r   r   r   r/   s  s   
zSubplotSpec.colspanc                 C      | j jdkS Nr   )r.   rs   r&   r   r   r   is_first_row|     zSubplotSpec.is_first_rowc                 C      | j j|  jkS r%   )r.   rt   rf   r   r&   r   r   r   is_last_row     zSubplotSpec.is_last_rowc                 C   r   r   )r/   rs   r&   r   r   r   is_first_col  r   zSubplotSpec.is_first_colc                 C   r   r%   )r/   rt   rf   r   r&   r   r   r   is_last_col  r   zSubplotSpec.is_last_colc                 C   s   |   }| \}}t| j| jg||f\}}||\}}}	}
||  }||  }|	|  }|
|  }t	
||||S )zJ
        Update the subplot position from ``figure.subplotpars``.
        )rf   r*   rJ   unravel_indexr}   r~   rb   minmaxr   from_extents)r   r+   r   r   r   r   r   r_   r^   r`   ra   
fig_bottomfig_topfig_left	fig_rightr   r   r   r     s   
zSubplotSpec.get_positionc                 C   s   |   }t|dr| S | S )zX
        Return the topmost `SubplotSpec` instance associated with the subplot.
        rc   )rf   rg   rc   )r   r   r   r   r   rc     s   
z#SubplotSpec.get_topmost_subplotspecc                 C   s8   | j | j| jft|dt t|dt t|dt fkS )z}
        Two SubplotSpecs are considered equal if they refer to the same
        position(s) in the same `GridSpec`.
        r   r}   r~   )r   r}   r~   r   r   )r   otherr   r   r   __eq__  s   zSubplotSpec.__eq__c                 C   s   t | j| j| jfS r%   )hashr   r}   r~   r&   r   r   r   __hash__  s   zSubplotSpec.__hash__c                 K   s   t ||| fi |S )a  
        Create a GridSpec within this subplot.

        The created `.GridSpecFromSubplotSpec` will have this `SubplotSpec` as
        a parent.

        Parameters
        ----------
        nrows : int
            Number of rows in grid.

        ncols : int
            Number of columns in grid.

        Returns
        -------
        `.GridSpecFromSubplotSpec`

        Other Parameters
        ----------------
        **kwargs
            All other parameters are passed to `.GridSpecFromSubplotSpec`.

        See Also
        --------
        matplotlib.pyplot.subplots

        Examples
        --------
        Adding three subplots in the space occupied by a single subplot::

            fig = plt.figure()
            gs0 = fig.add_gridspec(3, 1)
            ax1 = fig.add_subplot(gs0[0])
            ax2 = fig.add_subplot(gs0[1])
            gssub = gs0[2].subgridspec(1, 3)
            for i in range(3):
                fig.add_subplot(gssub[0, i])
        )r   )r   r   r   r   r   r   r   subgridspec  s   (zSubplotSpec.subgridspecr%   )r    r   r   r   r   r#   r   r   r   r~   setterrf   r*   r.   r/   r   r   r   r   r   rc   r   r  r  r   r   r   r   ry   	  s2    

/




ry   c                   @   s,   e Zd ZdZ		dddZ		dddZdS )r   zM
    Parameters defining the positioning of a subplots grid in a figure.
    Nc                 C   s:   dD ]}t | |tjd|   q| |||||| dS )au  
        Defaults are given by :rc:`figure.subplot.[name]`.

        Parameters
        ----------
        left : float
            The position of the left edge of the subplots,
            as a fraction of the figure width.
        right : float
            The position of the right edge of the subplots,
            as a fraction of the figure width.
        bottom : float
            The position of the bottom edge of the subplots,
            as a fraction of the figure height.
        top : float
            The position of the top edge of the subplots,
            as a fraction of the figure height.
        wspace : float
            The width of the padding between subplots,
            as a fraction of the average Axes width.
        hspace : float
            The height of the padding between subplots,
            as a fraction of the average Axes height.
        r   r   N)r   r   r   r   )r   rC   rE   rD   rF   rG   rH   ro   r   r   r   r     s   zSubplotParams.__init__c                 C   s   |dur|n| j |dur|n| jkrtd|dur|n| j|dur$|n| jkr,td|dur3|| _ |dur:|| _|durA|| _|durH|| _|durO|| _|durX|| _dS dS )zY
        Update the dimensions of the passed parameters. *None* means unchanged.
        Nzleft cannot be >= rightzbottom cannot be >= top)rC   rD   r	   rE   rF   rG   rH   )r   rC   rE   rD   rF   rG   rH   r   r   r   r     s*   
zSubplotParams.update)NNNNNN)r    r   r   r   r   r   r   r   r   r   r     s    
r   )r   r   loggingnumbersr   numpyrJ   
matplotlibr   r   r   r   matplotlib.transformsr   	getLoggerr    _logr   rh   r   ry   r   r   r   r   r   <module>   s$    
   < S