B
    Jdo                 @   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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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
:doc:`/tutorials/intermediate/arranging_axes` for a guide.
    N)Integral)_api_pylab_helperstight_layoutrcParams)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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r2|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   E/var/www/html/venv/lib/python3.7/site-packages/matplotlib/gridspec.py__init__!   s    
zGridSpecBase.__init__c             C   sb   t t| jdkrd| jf nd}t t| jdkr@d| jf nd}dj| jj| j| j|| dS )N   z, height_ratios=%r z, width_ratios=%rz&{clsname}({nrows}, {ncols}{optionals}))clsnamer   r   	optionals)	lenset_row_height_ratios_col_width_ratiosformat	__class____name__r   r   )r   Z
height_argZ	width_argr   r   r   __repr__:   s    ""zGridSpecBase.__repr__c             C   s   | j S )N)r   )r   r   r   r   <lambda>F       zGridSpecBase.<lambda>zThe number of rows in the grid.)docc             C   s   | j S )N)r   )r   r   r   r   r#   H   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_geometryK   s    zGridSpecBase.get_geometryc             C   s   d S )Nr   )r   figurer   r   r   get_subplot_paramsQ   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loc2Zsubplotspecr   r   r   new_subplotspecU   s    zGridSpecBase.new_subplotspecc             C   s6   |dk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   e   s
    zGridSpecBase.set_width_ratiosc             C   s   | j S )zo
        Return the width ratios.

        This is *None* if no width ratios have been set explicitly.
        )r   )r   r   r   r   get_width_ratioss   s    zGridSpecBase.get_width_ratiosc             C   s6   |dkrdg| j  }nt|| j kr,td|| _dS )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   {   s
    zGridSpecBase.set_height_ratiosc             C   s   | j S )zq
        Return the height ratios.

        This is *None* if no height ratios have been set explicitly.
        )r   )r   r   r   r   get_height_ratios   s    zGridSpecBase.get_height_ratiosFc                st  |   \}}|r*d}d}d}d}d}	d}
n.| |}|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*.
        raw : bool, default: False
            If *True*, the subplot parameters of the figure are not taken
            into account. The grid spans the range [0, 1] in both directions
            without margins and there is no space between grid cells. This is
            used for constrained_layout.

        Returns
        -------
        bottoms, tops, lefts, rights : array
            The bottom, top, left, right positions of the grid cells in
            figure coordinates.
        g        g      ?r   c                s   g | ]}|  qS r   r   ).0r)normr   r   
<listcomp>   s    z3GridSpecBase.get_grid_positions.<locals>.<listcomp>r   c                s   g | ]}|  qS r   r   )r1   r2   )r3   r   r   r4      s    )   )r&   r(   leftrightbottomtopwspacehspacesumr   npZcumsumZcolumn_stackflatr   ZreshapeT)r   Zfigrawr   r   r7   r8   r9   r:   r;   r<   Zsubplot_paramsZ	tot_widthZ
tot_heightZcell_hZsep_hZcell_heightsZsep_heightsZcell_hsZcell_wZsep_wZcell_widthsZ
sep_widthsZcell_wsfig_topsfig_bottoms	fig_lefts
fig_rightsr   )r3   r   get_grid_positions   s@    
zGridSpecBase.get_grid_positionsc             C   s`   xP|   D ]D}t|dr
|  }t|dr:|  }| ||fkr
|S q
W t||| dS )zo
        Check if the figure already has a gridspec with these dimensions,
        or create a new one
        get_subplotspecget_topmost_subplotspec)r'   )Zget_axeshasattrrG   get_gridspecrH   r&   GridSpec)r'   r   r   axgsr   r   r   _check_gridspec_exists   s    

z#GridSpecBase._check_gridspec_existsc       
   
   C   s   |   \}}dd }t|try|\}}W n, tk
rV } ztd|W dd}~X Y nX t|||d|||dg||f\}}	n|||| d\}}	t| ||	S )z,Create and return a `.SubplotSpec` instance.c             S   s   | }t | tr<| |\}}}||kr2||d fS tdnh| dk rL| | } d|   kr`|k rln n| | fS |d k	rtd| d| d| ntd| d| d S )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sizeZaxisorig_keystartstop_r   r   r   
_normalize   s    

z,GridSpecBase.__getitem__.<locals>._normalizezUnrecognized subplot specNr   r   )r&   r	   tupler
   r>   Zravel_multi_indexSubplotSpec)
r   rR   r   r   rX   Zk1Zk2errnum1num2r   r   r   __getitem__   s    
zGridSpecBase.__getitem__T)sharexshareysqueeze
subplot_kwc            C   s  | j }|dkrtdt|tr,|r(dnd}t|trB|r>dnd}t|trVtd tjddddg||d |dkrzi }| }t	j
| j| jftd	}x~t| jD ]p}xjt| jD ]\}d|d
 ||df |d|f d}	|	| |d< |	| |d< |j| ||f f||||f< qW qW |dkr@x|jD ]}
|
jdd q*W |dkrhx|jD ]}
|
jdd qRW |r|jdkr| S | S |S d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nonez]sharex argument to subplots() was an integer.  Did you intend to use subplot() (without 's')?rowcol)r_   r`   )Zdtype)r   r   r   )rd   rc   re   rf   r_   r`   )rf   rc   T)Zcheck_patch)re   rc   r   )r'   r
   r	   boolr   r   warn_externalZcheck_in_listcopyr>   emptyr   r   objectrangeZadd_subplotr?   Z_label_outer_xaxisZ_label_outer_yaxisrS   itemra   )r   r_   r`   ra   rb   r'   Zaxarrre   rf   Zshared_withrL   r   r   r   subplots  sB    



"

zGridSpecBase.subplots)NN)N)r   r   )F)r!   
__module____qualname____doc__r   r"   propertyr   r   r&   r(   r.   r   r/   r   r0   rF   staticmethodrN   r^   rn   r   r   r   r   r      s&   



=%r   c            	       sV   e Zd ZdZd fdd	Zddddd	d
gZdd ZdddZdd ZdddZ	  Z
S )rK   z
    A grid layout to place subplots within a figure.

    The location of the grid cells is determined in a similar way to
    `~.figure.SubplotParams` using *left*, *right*, *top*, *bottom*, *wspace*
    and *hspace*.
    Nc                sB   || _ || _|| _|| _|| _|	| _|| _t j|||
|d dS )a  
        Parameters
        ----------
        nrows, ncols : int
            The number of rows and columns of the grid.

        figure : `~.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)	r7   r9   r8   r:   r;   r<   r'   superr   )r   r   r   r'   r7   r9   r8   r:   r;   r<   r   r   )r    r   r   r   O  s    *
zGridSpec.__init__r7   r9   r8   r:   r;   r<   c             K   s   x:|  D ].\}}|| jkr*t| || q
t| dq
W xdtjj D ]T}xN|jj	j
D ]@}t|tj
jrZ|  }| | krZ|| |j	 qZW qJW 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 keywordN)items_AllowedKeyssetattrAttributeErrorr   ZGcfZfigsvaluesZcanvasr'   axesr	   mplZSubplotBaserG   rH   rJ   Z_set_positionget_position)r   kwargskvZ
figmanagerrL   ssr   r   r   update  s    
zGridSpec.updatec                sT   |dkr(dd  j D }tjjf |}nt|j}|jf  fdd j D  |S )z
        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.*`
        Nc             S   s   i | ]}t d |  |qS )zfigure.subplot.)r   )r1   r~   r   r   r   
<dictcomp>  s    z/GridSpec.get_subplot_params.<locals>.<dictcomp>c                s   i | ]}t  ||qS r   )getattr)r1   r~   )r   r   r   r     s    )rv   r{   r'   SubplotParamsri   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   )r1   r~   )r   r   r   r4     s    z<GridSpec.locally_modified_subplot_params.<locals>.<listcomp>)rv   )r   r   )r   r   locally_modified_subplot_params  s    z(GridSpec.locally_modified_subplot_paramsHzG?c       	   
   C   sd   t j|j| d}d|kr"td |dkr4t |}t j||j||||||d}|r`| jf | dS )ay  
        Adjust subplot parameters to give specified padding.

        Parameters
        ----------
        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 of 4 floats, default: (0, 0, 1, 1), i.e. the whole figure
            (left, bottom, right, top) rectangle in normalized figure
            coordinates that the whole subplots area (including labels) will
            fit into.
        )Z	grid_specNzcThis figure includes Axes that are not compatible with tight_layout, so results might be incorrect.)padh_padw_padrect)r   Zget_subplotspec_listrz   r   rh   Zget_rendererZget_tight_layout_figurer   )	r   r'   rendererr   r   r   r   Zsubplotspec_listr}   r   r   r   r     s    


zGridSpec.tight_layout)	NNNNNNNNN)N)Nr   NNN)r!   ro   rp   rq   r   rv   r   r(   r   r   __classcell__r   r   )r    r   rK   G  s      3
	 rK   c                   s4   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                s8   || _ || _|| _| 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.
        )r   r   N)_wspace_hspace_subplot_specrJ   r'   rt   r   )r   r   r   Zsubplot_specr;   r<   r   r   )r    r   r   r     s    
z GridSpecFromSubplotSpec.__init__c       	      C   s   | j dk	r| j n|dk	r |jjntd }| jdk	r8| jn|dk	rH|jjntd }| j|}|j\}}}}t	j
j||||||dS )z1Return a dictionary of subplot layout parameters.Nzfigure.subplot.hspacezfigure.subplot.wspace)r7   r8   r9   r:   r;   r<   )r   r   r<   r   r   r;   r   r|   Zextentsr{   r'   r   )	r   r'   r<   r;   figboxr7   r9   r8   r:   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   rH   )r   r   r   r   rH     s    z/GridSpecFromSubplotSpec.get_topmost_subplotspec)NNNN)N)r!   ro   rp   rq   r   r(   rH   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dd Zedd Zedd Zdd Zdd Zdd Zdd Zeddd,d!d"Zd#d$ Zd%d& Zd'd( Zd)d* ZdS )-rZ   aN  
    The location of a subplot in a `GridSpec`.

    .. note::

        Likely, you'll 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 )N)	_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, ])rJ   r*   rU   rV   r+   )r   r   r   r   r"   4  s    zSubplotSpec.__repr__c       	      C   sb  t |dkrx|\}t|tr |S t|ts8td|yttt|\}}}W q tk
rt   td|dY qX n,t |dkr|\}}}ntdt | dt	
| ||}|dkrt	||| d}t|trt |dkrtd	d
 |D std| |\}}nDt|tr2|dk s2||| krJt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   z0subplot() takes 1 or 3 positional arguments but z were given)r'   r6   c             s   s   | ]}t |tV  qd S )N)r	   r   )r1   nr   r   r   	<genexpr>Y  s    z1SubplotSpec._from_subplot_args.<locals>.<genexpr>z3Subplot specifier tuple must contain integers, not znum must be 1 <= num <= z, not )r   r	   rZ   r   r
   mapintstr	TypeErrorrK   rN   rY   rc   )	r'   argsargrowscolsnumrM   ijr   r   r   _from_subplot_args9  s:    



$zSubplotSpec._from_subplot_argsc             C   s   | j d kr| jS | j S )N)_num2r\   )r   r   r   r   r]   h  s    zSubplotSpec.num2c             C   s
   || _ d S )N)r   )r   valuer   r   r   r]   l  s    c             C   s   | j S )N)__dict__)r   r   r   r   __getstate__p  s    zSubplotSpec.__getstate__c             C   s   | j S )N)r   )r   r   r   r   rJ   s  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``).
        )rJ   r&   r\   r]   )r   r   r   r   r   r   r&   v  s    zSubplotSpec.get_geometryc             C   s$   |   j}t| j| | j| d S )z6The rows spanned by this subplot, as a `range` object.r   )rJ   r   rl   r\   r]   )r   r   r   r   r   r*     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   )rJ   r   sortedr\   r]   rl   )r   r   c1c2r   r   r   r+     s    
zSubplotSpec.colspanc             C   s   | j jdkS )Nr   )r*   rU   )r   r   r   r   is_first_row  s    zSubplotSpec.is_first_rowc             C   s   | j j|  jkS )N)r*   rV   rJ   r   )r   r   r   r   is_last_row  s    zSubplotSpec.is_last_rowc             C   s   | j jdkS )Nr   )r+   rU   )r   r   r   r   is_first_col  s    zSubplotSpec.is_first_colc             C   s   | j j|  jkS )N)r+   rV   rJ   r   )r   r   r   r   is_last_col  s    zSubplotSpec.is_last_colz3.4
return_allFc             C   s   |   }| \}}t| j| jg||f\}}||\}}	}
}||  }|	|  }|
|  }||  }t	
||||}|r||d |d ||fS |S dS )zJ
        Update the subplot position from ``figure.subplotpars``.
        r   N)rJ   r&   r>   Zunravel_indexr\   r]   rF   minmaxr   Zfrom_extents)r   r'   r   r   r   r   r   r   rC   rB   rD   rE   Z
fig_bottomZfig_topZfig_leftZ	fig_rightr   r   r   r   r|     s    zSubplotSpec.get_positionc             C   s"   |   }t|dr| S | S dS )zX
        Return the topmost `SubplotSpec` instance associated with the subplot.
        rH   N)rJ   rI   rH   )r   r   r   r   r   rH     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   rk   )r   otherr   r   r   __eq__  s    zSubplotSpec.__eq__c             C   s   t | j| j| jfS )N)hashr   r\   r]   )r   r   r   r   __hash__  s    zSubplotSpec.__hash__c             K   s   t ||| f|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 or 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.subgridspec)N)F)r!   ro   rp   rq   r   r"   rs   r   rr   r]   setterr   rJ   r&   r*   r+   r   r   r   r   r   Zdelete_parameterr|   rH   r   r   r   r   r   r   r   rZ     s*   
/	

rZ   )rq   ri   loggingnumbersr   numpyr>   Z
matplotlibr{   r   r   r   r   Zmatplotlib.transformsr   	getLoggerr!   _logr   rK   r   rZ   r   r   r   r   <module>   s   
  . 7