a
    PfA                     @  sF  d Z ddlmZ ddlmZ ddlZddlmZ ddl	Z
ddl	mZ ddlmZ erlddlmZ ddlmZ d=d
dZd>ddZdd Zd?ddZd@ddddddZdd ZdAddZdd ZdBddZdCd!d"ZdDd#d$Zdd%d&d'd(ZdEd)d*ZdFd+d,Z i fd-d.Z!dGd0d1Z"d2d3 Z#d4d5 Z$dHd7d8Z%d9d: Z&d;d< Z'dS )IzF
Module consolidating common testing functions for checking plotting.
    )annotations)TYPE_CHECKINGN)is_list_like)Series)SequenceAxesTc                 C  sb   |r|du rt dt| } | D ]<}|rL| dus8J t|  | q | du s J q dS )a)  
    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_check_text_labelsZ	get_texts)axeslabelsvisibleax r   U/var/www/ai-form-bot/venv/lib/python3.9/site-packages/pandas/tests/plotting/common.py_check_legend_labels   s    r   c                 C  sT   |r|du rt d|r@|  \}}dd |D }||ksPJ n|  du sPJ dS )a  
    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>@       z(_check_legend_marker.<locals>.<listcomp>)r	   Zget_legend_handles_labelsr   )r   Zexpected_markersr   Zhandles_markersr   r   r   _check_legend_marker/   s    r   c           	      C  sn   ddl m} |  }| }t|t|ks0J t||D ]$\}}| }| }t|| q:|d dS )z
    Check each axes has identical lines

    Parameters
    ----------
    xp : matplotlib Axes object
    rs : matplotlib Axes object
    r   Nall)	matplotlib.pyplotpyplot	get_lineslenzipZ
get_xydatatmassert_almost_equalclose)	ZxprspltZxp_linesZrs_linesZxplrslZxpdataZrsdatar   r   r   _check_dataF   s    	r'   c                 C  sB   ddl m} t| |s$t| s$| g} | D ]}| |ks(J q(dS )z
    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.collectionsr(   
isinstancer   get_visible)collectionsr   r(   patchr   r   r   _check_visible]   s
    r.   zAxes | Sequence[Axes]boolNone)r   filledreturnc                 C  s0   t | } | D ]}|jD ]}|j|ksJ 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fill)r   r1   r   r-   r   r   r   _check_patches_all_filledq   s    
r4   c                   s*   |   }tt||  fdd| jD S )Nc                   s   g | ]} | qS r   r   r   vZmappedr   r   r      r   z&_get_colors_mapped.<locals>.<listcomp>)uniquedictr    values)Zseriescolorsr8   r   r7   r   _get_colors_mapped   s    r<   c                 C  s  ddl m} ddlm}m}m} ddlm} |j}	|dur|dur\t	||}|dt
|  }t
| t
|kspJ t| |D ]d\}
}t|
|r|
 }|	|}n(t|
||frt|
 d }n|
 }|	|}||kszJ qz|dur|durt	||}|dt
|  }t
| t
|ks$J t| |D ]Z\}
}t|
|rP|
 d }n|
 }t|tjrnt|}|	|}||ks.J q.dS )a  
    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   )r;   )r(   LineCollectionPolyCollection)Line2DN)
matplotlibr;   r)   r(   r=   r>   Zmatplotlib.linesr?   ZColorConverterr<   r   r    r*   	get_colorZto_rgbatupleZget_edgecolorZget_facecolornpZndarray)r,   Z
linecolorsZ
facecolorsmappingr;   r(   r=   r>   r?   convr-   colorresultexpectedr   r   r   _check_colors   s>    






rI   c                 C  s`   t | s|  |ks\J nBdd | D }t|t|ks<J t||D ]\}}||ksFJ 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      r   z&_check_text_labels.<locals>.<listcomp>N)r   rJ   r   r    )ZtextsrH   r   labeler   r   r   r      s    r   c           	      C  s  ddl m} t| } | D ]}|dus,|durt|j |rF| }n| |jdd }|D ]4}|durzt|	 | |dur^t|
 | q^|dus|durt|j |r| }n| |jdd }|D ]4}|durt|	 | |durt|
 | qqdS )ac  
    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.tickerrN   r
   r*   xaxisZget_minor_formatterZget_xticklabelsr!   r"   Zget_fontsizeZget_rotationyaxisZget_yticklabels)	r   Z
xlabelsizeZxrotZ
ylabelsizeZyrotrN   r   r   rL   r   r   r   _check_ticks_props   s*    

rR   linearc                 C  s:   t | } | D ](}|j |ks"J |j |ksJ qdS )z
    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
   rP   Z	get_scalerQ   )r   rP   rQ   r   r   r   r   _check_ax_scales  s    rT   c                 C  s   ddl m} |du rd}t| }|durVt||ks8J |D ]}t| dks<J q<|durt }t }|| D ]4}|  }	||	d d  ||	d d  qrt|t|f}
|
|ksJ 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.toolsrV   r
   r   Zget_childrensetZget_positionZ
get_pointsaddr!   Zassert_numpy_array_equalfigureZget_size_inchesrC   arrayZfloat64)r   Zaxes_numZlayoutZfigsizerV   Zvisible_axesr   Zx_setZy_setZpointsrG   r   r   r   _check_axes_shape  s*    r]   zSequence[Axes])r   r2   c                 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   rU   c                 S  s   g | ]}|  r|qS r   )r+   )r   r   r   r   r   r   W  r   z$_flatten_visible.<locals>.<listcomp>)rX   rV   )r   rV   Zaxes_ndarrayr   r   r   r
   K  s    	r
   c           
      C  sv   t | } | D ]d}|j}d}d}|D ]4}t|dd}t|dd}	|rJ|d7 }|	r"|d7 }q"||ksdJ ||ksJ qdS )z
    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_yerrrW   N)r
   
containersgetattr)
r   ZxerrZyerrr   r`   Z
xerr_countZ
yerr_countcr^   r_   r   r   r   _check_has_errorbars[  s    
rc   c                 C  s  ddl m} t|td}|du rj|du r,d}t| || s>J |dkrft| j|sVJ t| jtsfJ n|du rt| D ]}t||szJ qzdS t| tsJ t	| 
 t	|ksJ |  D ]\}}t||| sJ |dkr|r| |ksJ q|dkrB|r|j |ksJ t|j|s.J t|jts|J q|dkrx|d d }	|	j}
|r||
 |ks|J qtqdS )	a<  
    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   )r9   r   bothNr9   rd   r   Zmedians)matplotlib.axesr   r9   rB   r*   r   linesr
   r   sortedkeysitemsZ	get_titler   AssertionError)Zreturnedreturn_typeZexpected_keysZcheck_ax_titler   typesrkeyvalueliner   r   r   r   _check_box_return_typew  s>    

rq   c                   s  dd l   fdd}d}|D ]l} jddt| | |d7 } jddd | jf d	|i| | rnJ  j   jddt| | |d7 } jdd
d | jf |dd| | rJ  j  |dvr jddt| | |d7 } jdd
d | jf d	|i| | s&J  j   jddt| | |d7 } jddd | jf |d
d| | sJ  j  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 NZgridliner+   r   gr   r   r   	<genexpr>  r   z;_check_grid_settings.<locals>.is_grid_on.<locals>.<genexpr>c                 s  s   | ]}|j   V  qd S rr   rs   rt   r   r   r   rv     r   )r   ZgcarP   Zget_major_ticksrQ   r   )ZxticksZyticksZxoffZyoffZmplr   r   
is_grid_on  s
    z(_check_grid_settings.<locals>.is_grid_onrW      r   F)gridkindT)r{   rz   )pieZhexbinZscatter)r@   r   Zsubplotr   rcZplotclf)objkindskwsrx   Zspndxr{   r   rw   r   _check_grid_settings  s:    





r   rF   c                   s    fdd| d D S )zL
    Auxiliary function for correctly unpacking cycler after MPL >= 1.5
    c                   s   g | ]}|  qS r   r   r5   fieldr   r   r     r   z"_unpack_cycler.<locals>.<listcomp>zaxes.prop_cycler   )ZrcParamsr   r   r   r   _unpack_cycler  s    r   c                 C  s
   | j d S )NxZ_shared_axesr   r   r   r   
get_x_axis  s    r   c                 C  s
   | j d S )Nyr   r   r   r   r   
get_y_axis  s    r   Fc              	   K  sx   ddl m} |rt}nt}d}zH|d| }|  || |fi |D ]}t| qJW |	| n|	| 0 |S )a  
    Create plot and ensure that plot return object is valid.

    Parameters
    ----------
    f : func
        Plotting function.
    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   Nr[   )
r   r   _gen_default_plot_gen_two_subplotsgetZgcfr~   r!   Z"assert_is_valid_plot_return_objectr#   )fZdefault_axeskwargsr%   Z	gen_plotsretfigr   r   r   _check_plot_works  s    r   c                 k  s   | f i |V  dS )z'
    Create plot in a default way.
    Nr   r   r   r   r   r   r   r      s    r   c                 k  s^   d|vr| d | f i |V  | tjju r<d|vsJJ n| d|d< | f i |V  dS )z9
    Create plot on two subplots forcefully created.
    r         N)Zadd_subplotpdZplottingZbootstrap_plotr   r   r   r   r   '  s    
r   )NT)NT)T)T)NNN)NNNN)rS   rS   )NNN)r   r   )NT)rF   )F)(__doc__
__future__r   typingr   numpyrC   Zpandas.core.dtypes.apir   Zpandasr   r   Zpandas._testingZ_testingr!   collections.abcr   re   r   r   r   r'   r.   r4   r<   rI   r   rR   rT   r]   r
   rc   rq   r   r   r   r   r   r   r   r   r   r   r   <module>   s@   



@
/

,
 
=-

0