U
    ÎZjÈL  ã                   @  s¼   d Z ddlmZ ddlmZmZ ddlZddlZddl	m
Z
 ddlm  mZ ddlmZ ddlZddlmZ ddlmZ erŠddlmZ ejG d	d
„ d
ƒƒZddd„Zdd„ Zdd„ ZdS )zF
Module consolidating common testing functions for checking plotting.
é    )Úannotations)ÚTYPE_CHECKINGÚSequenceN)Úcache_readonly)Úis_list_like)ÚSeries©ÚAxesc                   @  sô   e Zd ZdZdd„ Zdd„ Zedd„ ƒZedd	„ ƒZd9dd„Z	d:dd„Z
dd„ Zd;dd„Zd<ddddœdd„Zdd„ Zd=dd„Zdd„ Zd>d d!„Zd?d#d$„Zd@d%d&„Zd'd(„ Zd)d*„ ZdAd,d-„ZdBd.d/„Zi fd0d1„ZdCd3d4„Zd5d6„ Zd7d8„ Zd
S )DÚTestPlotBasezE
    This is a common base class used for various plotting tests
    c                 C  s   dd l }| ¡  d S ©Nr   )Ú
matplotlibZ
rcdefaults)ÚselfÚmpl© r   ú_/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/pandas/tests/plotting/common.pyÚsetup_method"   s    zTestPlotBase.setup_methodc                 C  s   t  ¡  d S ©N)ÚtmÚclose©r   r   r   r   Úteardown_method'   s    zTestPlotBase.teardown_methodc                 C  s   dd l m} |S r   )Úmatplotlib.pyplotÚpyplot)r   Úpltr   r   r   r   *   s    zTestPlotBase.pltc                 C  s   dd l m} |jS r   )Zmatplotlib.colorsÚcolorsZcolorConverter)r   r   r   r   r   Úcolorconverter0   s    zTestPlotBase.colorconverterNTc                 C  sf   |r|dkrt dƒ‚|  |¡}|D ]>}|rP| ¡ dk	s:t‚|  | ¡  ¡ |¡ q"| ¡ dks"t‚q"dS )aQ  
        Check each axes has expected legend labels

        Parameters
        ----------
        axes : matplotlib Axes object, or its list-like
        labels : list-like
            expected legend labels
        visible : bool
            expected legend visibility. labels are checked only when visible is
            True
        Nz-labels must be specified when visible is True)Ú
ValueErrorÚ_flatten_visibleÚ
get_legendÚAssertionErrorÚ_check_text_labelsZ	get_texts)r   ÚaxesÚlabelsÚvisibleÚaxr   r   r   Ú_check_legend_labels6   s    
z!TestPlotBase._check_legend_labelsc                 C  sT   |r|dkrt dƒ‚|r@| ¡ \}}dd„ |D ƒ}||ksPt‚n| ¡ dksPt‚dS )aB  
        Check ax has expected legend markers

        Parameters
        ----------
        ax : matplotlib Axes object
        expected_markers : list-like
            expected legend markers
        visible : bool
            expected legend visibility. labels are checked only when visible is
            True
        Nz.Markers must be specified when visible is Truec                 S  s   g | ]}|  ¡ ‘qS r   )Z
get_marker)Ú.0Úhandler   r   r   Ú
<listcomp>^   s     z5TestPlotBase._check_legend_marker.<locals>.<listcomp>)r   Zget_legend_handles_labelsr   r   )r   r$   Zexpected_markersr#   ZhandlesÚ_Úmarkersr   r   r   Ú_check_legend_markerM   s    z!TestPlotBase._check_legend_markerc           	      C  s`   |  ¡ }|  ¡ }t|ƒt|ƒks$t‚t||ƒD ]$\}}| ¡ }| ¡ }t ||¡ q.t ¡  dS )z¤
        Check each axes has identical lines

        Parameters
        ----------
        xp : matplotlib Axes object
        rs : matplotlib Axes object
        N)Ú	get_linesÚlenr   ÚzipZ
get_xydatar   Úassert_almost_equalr   )	r   ZxpÚrsZxp_linesZrs_linesZxplÚrslZxpdataZrsdatar   r   r   Ú_check_datac   s    	zTestPlotBase._check_datac                 C  sB   ddl m} t||ƒs$t|ƒs$|g}|D ]}| ¡ |ks(t‚q(dS )a   
        Check each artist is visible or not

        Parameters
        ----------
        collections : matplotlib Artist or its list-like
            target Artist or its list or collection
        visible : bool
            expected visibility
        r   )Ú
CollectionN)Úmatplotlib.collectionsr3   Ú
isinstancer   Úget_visibler   )r   Úcollectionsr#   r3   Úpatchr   r   r   Ú_check_visiblew   s
    zTestPlotBase._check_visiblezAxes | Sequence[Axes]ÚboolÚNone)r!   ÚfilledÚreturnc                 C  s2   |   |¡}|D ]}|jD ]}|j|kst‚qqdS )zÕ
        Check for each artist whether it is filled or not

        Parameters
        ----------
        axes : matplotlib Axes object, or its list-like
        filled : bool
            expected filling
        N)r   ZpatchesÚfillr   )r   r!   r<   r$   r8   r   r   r   Ú_check_patches_all_filledŠ   s    

z&TestPlotBase._check_patches_all_filledc                   s*   |  ¡ }tt||ƒƒ‰ ‡ fdd„|jD ƒS )Nc                   s   g | ]}ˆ | ‘qS r   r   ©r&   Úv©Zmappedr   r   r(   ¡   s     z3TestPlotBase._get_colors_mapped.<locals>.<listcomp>)ÚuniqueÚdictr.   Úvalues)r   Zseriesr   rC   r   rB   r   Ú_get_colors_mappedœ   s    zTestPlotBase._get_colors_mappedc                 C  s†  ddl m}m}m} ddlm} | j}	|dk	rÖ|dk	rR|  ||¡}|dt|ƒ… }t|ƒt|ƒksft	‚t
||ƒD ]d\}
}t|
|ƒr–|
 ¡ }|	 |¡}n(t|
||fƒr¶t|
 ¡ d ƒ}n|
 ¡ }|	 |¡}||kspt	‚qp|dk	�r‚|dk	�r|  ||¡}|dt|ƒ… }t|ƒt|ƒk�st	‚t
||ƒD ]Z\}
}t|
|ƒ�rH|
 ¡ d }n|
 ¡ }t|tjƒ�rft|ƒ}|	 |¡}||k�s&t	‚�q&dS )a3  
        Check each artist has expected line colors and face colors

        Parameters
        ----------
        collections : list-like
            list or collection of target artist
        linecolors : list-like which has the same length as collections
            list of expected line colors
        facecolors : list-like which has the same length as collections
            list of expected face colors
        mapping : Series
            Series used for color grouping key
            used for andrew_curves, parallel_coordinates, radviz test
        r   )r3   ÚLineCollectionÚPolyCollection)ÚLine2DN)r4   r3   rG   rH   Zmatplotlib.linesrI   r   rF   r-   r   r.   r5   Ú	get_colorZto_rgbaÚtupleZget_edgecolorZget_facecolorÚnpZndarray)r   r7   Z
linecolorsZ
facecolorsÚmappingr3   rG   rH   rI   Úconvr8   ÚcolorÚresultÚexpectedr   r   r   Ú_check_colors£   s<    




zTestPlotBase._check_colorsc                 C  s`   t |ƒs| ¡ |ks\t‚nBdd„ |D ƒ}t|ƒt|ƒks<t‚t||ƒD ]\}}||ksFt‚qFdS )a.  
        Check each text has expected labels

        Parameters
        ----------
        texts : matplotlib Text object, or its list-like
            target text, or its list
        expected : str or list-like which has the same length as texts
            expected text label, or its list
        c                 S  s   g | ]}|  ¡ ‘qS r   )Úget_text)r&   Útr   r   r   r(   ó   s     z3TestPlotBase._check_text_labels.<locals>.<listcomp>N)r   rS   r   r-   r.   )r   ZtextsrQ   r"   ÚlabelÚer   r   r   r    å   s    zTestPlotBase._check_text_labelsc           
      C  s  ddl m} |  |¡}|D ]ô}|dk	s.|dk	r–t|j ¡ |ƒrH| ¡ }n| ¡ |jdd� }|D ]4}	|dk	r|t |	 	¡ |¡ |dk	r`t |	 
¡ |¡ q`|dk	s¦|dk	rt|j ¡ |ƒrÀ| ¡ }n| ¡ |jdd� }|D ]4}	|dk	rôt |	 	¡ |¡ |dk	rØt |	 
¡ |¡ qØqdS )a—  
        Check each axes has expected tick properties

        Parameters
        ----------
        axes : matplotlib Axes object, or its list-like
        xlabelsize : number
            expected xticks font size
        xrot : number
            expected xticks rotation
        ylabelsize : number
            expected yticks font size
        yrot : number
            expected yticks rotation
        r   )ÚNullFormatterNT)Úminor)Zmatplotlib.tickerrW   r   r5   ÚxaxisZget_minor_formatterZget_xticklabelsr   r/   Zget_fontsizeZget_rotationÚyaxisZget_yticklabels)
r   r!   Z
xlabelsizeZxrotZ
ylabelsizeZyrotrW   r$   r"   rU   r   r   r   Ú_check_ticks_propsø   s*    


zTestPlotBase._check_ticks_propsÚlinearc                 C  s<   |   |¡}|D ](}|j ¡ |ks$t‚|j ¡ |kst‚qdS )a  
        Check each axes has expected scales

        Parameters
        ----------
        axes : matplotlib Axes object, or its list-like
        xaxis : {'linear', 'log'}
            expected xaxis scale
        yaxis : {'linear', 'log'}
            expected yaxis scale
        N)r   rY   Z	get_scaler   rZ   )r   r!   rY   rZ   r$   r   r   r   Ú_check_ax_scales(  s    
zTestPlotBase._check_ax_scalesc           	      C  s    ddl m} |dkrd}|  |¡}|dk	rXt|ƒ|ks:t‚|D ]}t| ¡ ƒdks>t‚q>|dk	rz|  ||ƒ¡}||kszt‚t |d j	 
¡ tj|tjd�¡ dS )aÎ  
        Check expected number of axes is drawn in expected layout

        Parameters
        ----------
        axes : matplotlib Axes object, or its list-like
        axes_num : number
            expected number of axes. Unnecessary axes should be set to
            invisible.
        layout : tuple
            expected layout, (expected number of rows , columns)
        figsize : tuple
            expected figsize. default is matplotlib default
        r   ©Úflatten_axesN)gš™™™™™@g333333@)Zdtype)Ú!pandas.plotting._matplotlib.toolsr_   r   r-   r   Zget_childrenÚ_get_axes_layoutr   Zassert_numpy_array_equalÚfigureZget_size_inchesrL   ÚarrayZfloat64)	r   r!   Zaxes_numZlayoutZfigsizer_   Zvisible_axesr$   rP   r   r   r   Ú_check_axes_shape9  s    
þzTestPlotBase._check_axes_shapec                 C  sV   t ƒ }t ƒ }|D ]4}| ¡  ¡ }| |d d ¡ | |d d ¡ qt|ƒt|ƒfS )Nr   é   )ÚsetZget_positionZ
get_pointsÚaddr-   )r   r!   Zx_setZy_setr$   Zpointsr   r   r   ra   ]  s    zTestPlotBase._get_axes_layoutc                 C  s&   ddl m} ||ƒ}dd„ |D ƒ}|S )z—
        Flatten axes, and filter only visible

        Parameters
        ----------
        axes : matplotlib Axes object, or its list-like

        r   r^   c                 S  s   g | ]}|  ¡ r|‘qS r   )r6   )r&   r$   r   r   r   r(   s  s      z1TestPlotBase._flatten_visible.<locals>.<listcomp>)r`   r_   )r   r!   r_   r   r   r   r   g  s    	zTestPlotBase._flatten_visibler   c                 C  sx   |   |¡}|D ]d}|j}d}d}|D ]4}t|ddƒ}	t|ddƒ}
|	rL|d7 }|
r$|d7 }q$||ksft‚||kst‚qdS )a  
        Check axes has expected number of errorbars

        Parameters
        ----------
        axes : matplotlib Axes object, or its list-like
        xerr : number
            expected number of x errorbar
        yerr : number
            expected number of y errorbar
        r   Úhas_xerrFÚhas_yerrre   N)r   Ú
containersÚgetattrr   )r   r!   ZxerrZyerrr$   rj   Z
xerr_countZ
yerr_countÚcrh   ri   r   r   r   Ú_check_has_errorbarsv  s    

z!TestPlotBase._check_has_errorbarsc                 C  s„  ddl m} t|tdœ}|dkrj|dkr,d}t||| ƒs>t‚|dkrft|j|ƒsVt‚t|jtƒsft‚�n|dkr”|  |¡D ]}t||ƒs|t‚q|dS t|t	ƒs¢t‚t
| ¡ ƒt
|ƒksºt‚| ¡ D ]¼\}}	t|	|| ƒsÜt‚|dkrú|rø|	 ¡ |ksøt‚qÂ|dk�rD|�r|	j ¡ |k�st‚t|	j|ƒ�s0t‚t|	jtƒ�s~t‚qÂ|dk�rz|	d d }
|
j}|�r~| ¡ |k�s~t‚qÂt‚qÂdS )	at  
        Check box returned type is correct

        Parameters
        ----------
        returned : object to be tested, returned from boxplot
        return_type : str
            return_type passed to boxplot
        expected_keys : list-like, optional
            group labels in subplot case. If not passed,
            the function checks assuming boxplot uses single ax
        check_ax_title : bool
            Whether to check the ax.title is the same as expected_key
            Intended to be checked by calling from ``boxplot``.
            Normal ``plot`` doesn't attach ``ax.title``, it must be disabled.
        r   r   )rD   r!   ÚbothNrD   rn   r!   Zmedians)Úmatplotlib.axesr	   rD   rK   r5   r   r$   Úlinesr   r   ÚsortedÚkeysÚitemsZ	get_titler!   )r   ZreturnedÚreturn_typeZexpected_keysZcheck_ax_titler	   ÚtypesÚrÚkeyÚvalueÚliner!   r   r   r   Ú_check_box_return_type‘  s>    

z#TestPlotBase._check_box_return_typec                   sf  dd l }‡ fdd„}d}|D �]B}ˆ j ddt|ƒ |¡ |d7 }|jddd� |jf d	|i|—Ž |ƒ rnt‚ˆ j ddt|ƒ |¡ |d7 }|jdd
d� |jf |ddœ|—Ž |ƒ r¼t‚|dkrˆ j ddt|ƒ |¡ |d7 }|jdd
d� |jf d	|i|—Ž |ƒ �st‚ˆ j ddt|ƒ |¡ |d7 }|jddd� |jf |d
dœ|—Ž |ƒ st‚qd S )Nr   c                    sN   ˆ j  ¡ j ¡ } ˆ j  ¡ j ¡ }tdd„ | D ƒƒ}tdd„ |D ƒƒ}|oJ| S )Nc                 s  s   | ]}|j  ¡  V  qd S r   ©Zgridliner6   ©r&   Úgr   r   r   Ú	<genexpr>Õ  s     zHTestPlotBase._check_grid_settings.<locals>.is_grid_on.<locals>.<genexpr>c                 s  s   | ]}|j  ¡  V  qd S r   r{   r|   r   r   r   r~   Ö  s     )r   ZgcarY   Zget_major_ticksrZ   Úall)ZxticksZyticksZxoffZyoffr   r   r   Ú
is_grid_onÒ  s
    z5TestPlotBase._check_grid_settings.<locals>.is_grid_onre   é   r!   F)ÚgridÚkindT)rƒ   r‚   )ÚpieZhexbinZscatter)r   r   Zsubplotr-   ÚrcZplotr   )r   ÚobjÚkindsÚkwsr   r€   Zspndxrƒ   r   r   r   Ú_check_grid_settingsÍ  s2    


z!TestPlotBase._check_grid_settingsrO   c                   s   ‡ fdd„|d D ƒS )zT
        Auxiliary function for correctly unpacking cycler after MPL >= 1.5
        c                   s   g | ]}|ˆ  ‘qS r   r   r@   ©Úfieldr   r   r(   ú  s     z/TestPlotBase._unpack_cycler.<locals>.<listcomp>zaxes.prop_cycler   )r   ZrcParamsr‹   r   rŠ   r   Ú_unpack_cyclerö  s    zTestPlotBase._unpack_cyclerc                 C  s"   ddl m} |ƒ r|jd S |jS )Nr   ©Úmpl_ge_3_5_0Úx)Ú"pandas.plotting._matplotlib.compatrŽ   Ú_shared_axesZ_shared_x_axes©r   r$   rŽ   r   r   r   Ú
get_x_axisü  s    
zTestPlotBase.get_x_axisc                 C  s"   ddl m} |ƒ r|jd S |jS )Nr   r�   Úy)r�   rŽ   r‘   Z_shared_y_axesr’   r   r   r   Ú
get_y_axis  s    
zTestPlotBase.get_y_axis)NT)NT)T)T)NNN)NNNN)r\   r\   )NNN)r   r   )NT)rO   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r%   r+   r2   r9   r?   rF   rR   r    r[   r]   rd   ra   r   rm   rz   r‰   rŒ   r“   r•   r   r   r   r   r
      sH   




 ÿ     ÿ
B       ÿ
0

$

   ÿ
<)
r
   ÚalwaysFc           
      K  sâ   ddl m} |rt}nt}d}t ¡ �² t |¡ zˆz\| 	d| 
¡ ¡}| ¡  || |f|ŽD ]}t |¡ q\tjdd��}| |¡ W 5 Q R X W n& tk
r¶ }	 z|	‚W 5 d}	~	X Y nX W 5 t |¡ X |W  5 Q R £ S Q R X dS )aT  
    Create plot and ensure that plot return object is valid.

    Parameters
    ----------
    f : func
        Plotting function.
    filterwarnings : str
        Warnings filter.
        See https://docs.python.org/3/library/warnings.html#warning-filter
    default_axes : bool, optional
        If False (default):
            - If `ax` not in `kwargs`, then create subplot(211) and plot there
            - Create new subplot(212) and plot there as well
            - Mind special corner case for bootstrap_plot (see `_gen_two_subplots`)
        If True:
            - Simply run plotting function with kwargs provided
            - All required axes instances will be created automatically
            - It is recommended to use it when the plotting function
            creates multiple axes itself. It helps avoid warnings like
            'UserWarning: To output multiple subplots,
            the figure containing the passed axes is being cleared'
    **kwargs
        Keyword arguments passed to the plotting function.

    Returns
    -------
    Plot object returned by the last plotting.
    r   Nrb   T)Zreturn_filelike)r   r   Ú_gen_default_plotÚ_gen_two_subplotsÚwarningsÚcatch_warningsÚsimplefilterr   r   ÚgetZgcfZclfZ"assert_is_valid_plot_return_objectZensure_cleanZsavefigÚ	Exception)
ÚfÚfilterwarningsZdefault_axesÚkwargsr   Z	gen_plotsÚretÚfigÚpathÚerrr   r   r   Ú_check_plot_works  s$    

r©   c                 k  s   | f |ŽV  dS )z'
    Create plot in a default way.
    Nr   ©r¢   r¦   r¤   r   r   r   r›   E  s    r›   c                 k  sV   d|kr|  d¡ | f |ŽV  | tjjkr8d|ksFt‚n|  d¡|d< | f |ŽV  dS )z9
    Create plot on two subplots forcefully created.
    r$   éÓ   éÔ   N)Zadd_subplotÚpdZplottingZbootstrap_plotr   rª   r   r   r   rœ   L  s    
rœ   )rš   F)r™   Ú
__future__r   Útypingr   r   r�   ÚnumpyrL   Zpandas.util._decoratorsr   Zpandas.util._test_decoratorsÚutilZ_test_decoratorsÚtdZpandas.core.dtypes.apir   Zpandasr­   r   Zpandas._testingZ_testingr   ro   r	   Zskip_if_no_mplr
   r©   r›   rœ   r   r   r   r   Ú<module>   s(      q
: