o
    gA                     @  s:  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r6d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Zdd ZdAddZdd ZdBd d!ZdCd#d$ZdAd%d&ZdDd(d)ZdEd*d+Z		d>d,d-Z i fd.d/Z!dFd1d2Z"d3d4 Z#d5d6 Z$dGd8d9Z%d:d; Z&d<d= Z'dS )HzF
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 ]}|r&| dusJ 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_labels	get_texts)axeslabelsvisibleax r   ^/var/www/html/ecg_monitoring/venv/lib/python3.10/site-packages/pandas/tests/plotting/common.py_check_legend_labels   s   r   c                 C  sV   |r
|du r
t d|r!|  \}}dd |D }||ksJ dS |  du s)J 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     g | ]}|  qS r   )
get_marker).0handler   r   r   
<listcomp>@       z(_check_legend_marker.<locals>.<listcomp>)r	   get_legend_handles_labelsr   )r   expected_markersr   handles_markersr   r   r   _check_legend_marker/   s   r    c           	      C  sn   ddl m} |  }| }t|t|ksJ 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zip
get_xydatatmassert_almost_equalclose)	xprspltxp_linesrs_linesxplrslxpdatarsdatar   r   r   _check_dataF   s   	r4   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.collectionsr5   
isinstancer   get_visible)collectionsr   r5   patchr   r   r   _check_visible]   s   r;   r   Axes | Sequence[Axes]filledboolreturnNonec                 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
   patchesfill)r   r=   r   r:   r   r   r   _check_patches_all_filledq   s   
rC   c                   s*   |   }tt||  fdd| jD S )Nc                   s   g | ]} | qS r   r   r   vmappedr   r   r      r   z&_get_colors_mapped.<locals>.<listcomp>)uniquedictr&   values)seriescolorsrH   r   rF   r   _get_colors_mapped   s   rM   c                 C  s  ddl m} ddlm}m}m} ddlm} |j}	|durp|dur.t	||}|dt
|  }t
| t
|ks8J t| |D ]2\}
}t|
|rP|
 }|	|}nt|
||fr`t|
 d }n|
 }|	|}||ksoJ q=|dur|durt	||}|dt
|  }t
| t
|ksJ t| |D ]+\}
}t|
|r|
 d }n|
 }t|tjrt|}|	|}||ksJ qdS 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   )rL   )r5   LineCollectionPolyCollection)Line2DN)
matplotlibrL   r6   r5   rN   rO   matplotlib.linesrP   ColorConverterrM   r%   r&   r7   	get_colorto_rgbatupleget_edgecolorget_facecolornpndarray)r9   
linecolors
facecolorsmappingrL   r5   rN   rO   rP   convr:   colorresultexpectedr   r   r   _check_colors   sB   





rb   c                 C  sb   t | s|  |ksJ dS dd | D }t|t|ksJ t||D ]
\}}||ks.J q$d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  r   r   )get_text)r   tr   r   r   r      r   z&_check_text_labels.<locals>.<listcomp>N)r   rc   r%   r&   )textsra   r   labeler   r   r   r      s   r   c           	      C  s  ddl m} t| } | D ]z}|dus|durJt|j |r#| }n
| |jdd }|D ]}|dur=t|	 | |durIt|
 | q/|dusR|durt|j |r_| }n
| |jdd }|D ]}|duryt|	 | |durt|
 | qkq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)matplotlib.tickerrh   r
   r7   xaxisget_minor_formatterget_xticklabelsr(   r)   get_fontsizeget_rotationyaxisget_yticklabels)	r   
xlabelsizexrot
ylabelsizeyrotrh   r   r   rf   r   r   r   _check_ticks_props   s0   

rv   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
   rk   	get_scalerp   )r   rk   rp   r   r   r   r   _check_ax_scales  s
   ry   c                 C  s   ddl m} |du rd}t| }|dur+t||ksJ |D ]}t| dks*J q|durbt }t }|| D ]}|  }	||	d d  ||	d d  q9t|t|f}
|
|ksbJ 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@   )dtype)!pandas.plotting._matplotlib.toolsr{   r
   r%   get_childrensetget_position
get_pointsaddr(   assert_numpy_array_equalfigureget_size_inchesrY   arrayfloat64)r   axes_numlayoutfigsizer{   visible_axesr   x_sety_setpointsr`   r   r   r   _check_axes_shape  s*   r   Sequence[Axes]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   rz   c                 S  s   g | ]}|  r|qS r   )r8   )r   r   r   r   r   r   W  s    z$_flatten_visible.<locals>.<listcomp>)r~   r{   )r   r{   axes_ndarrayr   r   r   r
   K  s   	r
   c           
      C  sv   t | } | D ]2}|j}d}d}|D ]}t|dd}t|dd}	|r%|d7 }|	r+|d7 }q||ks2J ||ks8J 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_yerrr|   N)r
   
containersgetattr)
r   xerryerrr   r   
xerr_count
yerr_countcr   r   r   r   r   _check_has_errorbars[  s    r   c                 C  st  ddl m} t|td}|du r7|du rd}t| || sJ |dkr3t| j|s+J t| jts5J dS dS |du rKt| D ]	}t||sHJ q?dS t| tsRJ t	| 
 t	|ks^J |  D ]U\}}t||| soJ |dkr~|r}| |ks}J qb|dkr|r|j |ksJ t|j|sJ t|jtsJ qb|dkr|d d }	|	j}
|r|
 |ksJ qbtd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   )rI   r   bothNrI   r   r   medians)matplotlib.axesr   rI   rV   r7   r   linesr
   r   sortedkeysitems	get_titler   AssertionError)returnedreturn_typeexpected_keyscheck_ax_titler   typesrkeyvalueliner   r   r   r   _check_box_return_typew  sH   r   c                   s  dd l   fdd}d}|D ]} jddt| | |d7 } jddd | jdd	|i| | r6J  j   jddt| | |d7 } jdd
d | jd|dd| | rbJ  j  |dvr jddt| | |d7 } jdd
d | jdd	|i| | sJ  j   jddt| | |d7 } jddd | jd|d
d| | sJ  j  qd S )Nr   c                    sN    j  j }  j  j }tdd | D }tdd |D }|o%| S )Nc                 s      | ]	}|j   V  qd S Ngridliner8   r   gr   r   r   	<genexpr>      z;_check_grid_settings.<locals>.is_grid_on.<locals>.<genexpr>c                 s  r   r   r   r   r   r   r   r     r   )r#   gcark   get_major_ticksrp   r!   )xticksyticksxoffyoffmplr   r   
is_grid_on  s
   
z(_check_grid_settings.<locals>.is_grid_onr|      r   F)gridkindT)r   r   )piehexbinscatterr   )rQ   r#   subplotr%   rcplotclf)objkindskwsr   spndxr   r   r   r   _check_grid_settings  s>   







r   r_   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   rD   fieldr   r   r     r   z"_unpack_cycler.<locals>.<listcomp>zaxes.prop_cycler   )rcParamsr   r   r   r   _unpack_cycler  s   r   c                 C  
   | j d S )Nx_shared_axesr   r   r   r   
get_x_axis     
r   c                 C  r   )Nyr   r   r   r   r   
get_y_axis  r   r   Fc              	   K  sv   ddl m} |rt}nt}d}z%|d| }|  || |fi |D ]}t| q%W |	| |S |	| w )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getgcfr   r(   "assert_is_valid_plot_return_objectr*   )fdefault_axeskwargsr-   	gen_plotsretfigr   r   r   _check_plot_works  s   
r   c                 k  s    | di |V  dS )z'
    Create plot in a default way.
    Nr   r   r   r   r   r   r   r   r      s   r   c                 k  s`    d|vr
| d | di |V  | tjju rd|vsJ n| d|d< | di |V  dS )z9
    Create plot on two subplots forcefully created.
    r         Nr   )add_subplotpdplottingbootstrap_plotr   r   r   r   r   '  s   
r   )NT)T)r   r<   r=   r>   r?   r@   )NNN)NNNN)rw   rw   )r   r<   r?   r   )r   r   )r_   )F)(__doc__
__future__r   typingr   numpyrY   pandas.core.dtypes.apir   pandasr   r   pandas._testing_testingr(   collections.abcr   r   r   r   r    r4   r;   rC   rM   rb   r   rv   ry   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sB    



@

/

,

=
-
0