B
    x\<H                 @   s   d dl Z d dlZd dlZd dlmZ d dlZd dlmZmZ d dl	m
Z
 d dlm  mZ d dlmZ d dlmZmZ d dlm  mZ d dlmZmZ d dlmZ d dlmZ d	d
 Zdd ZejG dd de Z!dddZ"dd Z#dS )    N)random)	iteritemszip)cache_readonly)is_list_like)	DataFrameSeries)"assert_is_valid_plot_return_objectensure_clean)_flattenc              C   s4   yddl m}  W n tk
r.   td Y nX d S )Nr   )gaussian_kdez*scipy version doesn't support gaussian_kde)scipy.statsr   ImportErrorpytestskip)r    r   ;lib/python3.7/site-packages/pandas/tests/plotting/common.py_skip_if_no_scipy_gaussian_kde   s    r   c             C   s2   | dkr.yddl m} W n tk
r,   dS X dS )N)ZkdeZdensityr   )r   FT)r   r   r   )kindr   r   r   r   _ok_for_gaussian_kde&   s    r   c               @   s   e Zd Zdd Zdd Zedd Zedd Zd,ddZdd Z	d-ddZ
dd Zd.ddZdd Zd/ddZd0ddZd1ddZdd Zd d! Zd2d#d$Zd3d%d&Zi fd'd(Zd4d*d+Zd	S )5TestPlotBasec          
   C   s(  dd l }|  tj | _tj | _tj | _	tj
 | _tj | _d| _d| _d| _d| _d}tdh tjjdd	g|d
}tjjdddg|d
}t||tjdd|d
tjdd|d
tjd|d
d| _W d Q R X t | _ttjjdd
tjjdd
tdtjjdd
 d| _d S )Nr         )g@g333333@leftd   *   ZMaleZFemale)sizeABCB             )gender	classroomZheightZweightcategory   )r   r   r   ) 
matplotlibZ
rcdefaultsplottingZ_compatZ_mpl_ge_2_0_1Zmpl_ge_2_0_1Z_mpl_ge_2_1_0Zmpl_ge_2_1_0Z_mpl_ge_2_2_0Zmpl_ge_2_2_0Z_mpl_ge_2_2_2Zmpl_ge_2_2_2Z_mpl_ge_3_0_0Zmpl_ge_3_0_0Zbp_n_objectsZpolycollection_factordefault_figsizeZdefault_tick_positiontmZ
RNGContextnpr   Zchoicer   ZnormalZrandintZhist_dfZmakeTimeDataFrameZtdfZuniformZarangeZ	hexbin_df)selfmethodmplnr$   r%   r   r   r   setup_method3   s2     
zTestPlotBase.setup_methodc             C   s   t   d S )N)r+   close)r-   r.   r   r   r   teardown_methodT   s    zTestPlotBase.teardown_methodc             C   s   dd l m} |S )Nr   )matplotlib.pyplotpyplot)r-   pltr   r   r   r6   W   s    zTestPlotBase.pltc             C   s   dd l m} |jS )Nr   )Zmatplotlib.colorscolorsZcolorConverter)r-   r7   r   r   r   colorconverter\   s    zTestPlotBase.colorconverterNTc             C   sj   |r|dkrt d| |}xF|D ]>}|rR| dk	s<t| |  | q$| dks$tq$W 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_visibleZ
get_legendAssertionError_check_text_labelsZ	get_texts)r-   axeslabelsvisibleaxr   r   r   _check_legend_labelsa   s    

z!TestPlotBase._check_legend_labelsc                sP   |  }|  }dd  t|t|ks,t fddt||D  t  dS )z
        Check each axes has identical lines

        Parameters
        ----------
        xp : matplotlib Axes object
        rs : matplotlib Axes object
        c             S   s    |   }|  }t|| d S )N)Z
get_xydatar+   assert_almost_equal)xplrslZxpdataZrsdatar   r   r   
check_line   s    z,TestPlotBase._check_data.<locals>.check_linec                s   g | ]\}} ||qS r   r   ).0rC   rD   )rE   r   r   
<listcomp>   s    z,TestPlotBase._check_data.<locals>.<listcomp>N)	get_lineslenr;   r   r+   r2   )r-   ZxpZrsZxp_linesZrs_linesr   )rE   r   _check_datay   s    	zTestPlotBase._check_datac             C   sF   ddl m} t||s$t|s$|g}x|D ]}| |ks*tq*W 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.collectionsrK   
isinstancer   get_visibler;   )r-   collectionsr?   rK   patchr   r   r   _check_visible   s    
zTestPlotBase._check_visiblec                s*   |  }tt||  fdd|jD S )Nc                s   g | ]} | qS r   r   )rF   v)mappedr   r   rG      s    z3TestPlotBase._get_colors_mapped.<locals>.<listcomp>)uniquedictr   values)r-   Zseriesr7   rT   r   )rS   r   _get_colors_mapped   s    zTestPlotBase._get_colors_mappedc             C   s  ddl m} ddlm}m}m} | j}	|dk	r|dk	rR| ||}|dt| }t|t|ksft	xrt
||D ]d\}
}t|
|r|
 }|	|}n(t|
||frt|
 d }n|
 }|	|}||ksrt	qrW |dk	r|dk	r
| ||}|dt| }t|t|ks t	xht
||D ]Z\}
}t|
|rN|
 d }n|
 }t|tjrlt|}|	|}||ks,t	q,W 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   )Line2D)rK   PolyCollectionLineCollectionN)Zmatplotlib.linesrX   rL   rK   rY   rZ   r8   rW   rI   r;   r   rM   Z	get_colorZto_rgbatupleZget_edgecolorZget_facecolorr,   Zndarray)r-   rO   Z
linecolorsZ
facecolorsmappingrX   rK   rY   rZ   ZconvrP   colorresultexpectedr   r   r   _check_colors   s<    




zTestPlotBase._check_colorsc             C   sd   t |s| |ks`tnFdd |D }t|t|ks<tx"t||D ]\}}||ksHtqHW 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   s   g | ]}|  qS r   )get_text)rF   tr   r   r   rG      s    z3TestPlotBase._check_text_labels.<locals>.<listcomp>N)r   ra   r;   rI   r   )r-   Ztextsr_   r>   labeler   r   r   r<      s    zTestPlotBase._check_text_labelsc       
      C   s  ddl m} | |}x|D ]}|s(|rt|j |rB| }n| |jdd }x<|D ]4}	|dk	rxt|		 | |dk	r\t|	
 | q\W |s|rt|j |r| }n| |jdd }x<|D ]4}	|dk	rt|		 | |dk	rt|	
 | qW qW 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   )NullFormatterT)minorN)Zmatplotlib.tickerre   r:   rM   xaxisZget_minor_formatterZget_xticklabelsr+   rB   Zget_fontsizeZget_rotationyaxisZget_yticklabels)
r-   r=   Z
xlabelsizeZxrotZ
ylabelsizeZyrotre   r@   r>   rc   r   r   r   _check_ticks_props   s2    











zTestPlotBase._check_ticks_propslinearc             C   s@   |  |}x0|D ](}|j |ks&t|j |kstqW 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:   rg   Z	get_scaler;   rh   )r-   r=   rg   rh   r@   r   r   r   _check_ax_scales,  s    

zTestPlotBase._check_ax_scalesc             C   s   |dkr| j }| |}|dk	rRt||ks0tx |D ]}t| dks6tq6W |dk	rt| t|}||kstt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
        Nr   )Zdtype)r*   r:   rI   r;   Zget_children_get_axes_layoutr   r+   Zassert_numpy_array_equalfigureZget_size_inchesr,   ZarrayZfloat64)r-   r=   Zaxes_numZlayoutZfigsizeZvisible_axesr@   r^   r   r   r   _check_axes_shape=  s    

zTestPlotBase._check_axes_shapec             C   sZ   t  }t  }x<|D ]4}|  }||d d  ||d d  qW t|t|fS )Nr      )setZget_positionZ
get_pointsaddrI   )r-   r=   Zx_setZy_setr@   Zpointsr   r   r   rl   _  s    
zTestPlotBase._get_axes_layoutc             C   s   t |}dd |D }|S )z
        Flatten axes, and filter only visible

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

        c             S   s   g | ]}|  r|qS r   )rN   )rF   r@   r   r   r   rG   s  s    z1TestPlotBase._flatten_visible.<locals>.<listcomp>)r   )r-   r=   r   r   r   r:   i  s    	zTestPlotBase._flatten_visibler   c             C   s   |  |}xp|D ]h}|j}d}d}x<|D ]4}t|dd}	t|dd}
|	rP|d7 }|
r(|d7 }q(W ||kslt||kstqW 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_yerrro   N)r:   
containersgetattrr;   )r-   r=   ZxerrZyerrr@   rt   Z
xerr_countZ
yerr_countcrr   rs   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rx | |D ]}t||s~tq~W dS t|t	stt
| t
|kstxt|D ]\}}	t|	|| st|dkr|r|	 |kstq|dkrP|r*|	j |ks*tt|	j|s<tt|	jtstq|dkr|	d d }
|
j}|r| |kstqtqW 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   )Axes)rU   r=   bothNrU   ry   r=   Zmedians)Zmatplotlib.axesrx   rU   r[   rM   r;   r@   linesr:   r   sortedkeysr   Z	get_titler=   )r-   ZreturnedZreturn_typeZexpected_keysZcheck_ax_titlerx   typesrkeyvalueliner=   r   r   r   _check_box_return_type  s>    


z#TestPlotBase._check_box_return_typec                sv  dd l } fdd}d}xV|D ]L}t|s0q  jddt| | |d7 }|jddd |jf d	|i| | r|t jddt| | |d7 }|jdd
d |jf |dd| | rt|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 W d S )Nr   c                 sF   t dd  j j D } t dd  j j D }| oB| S )Nc             s   s   | ]}|j  V  qd S )N)gridOn)rF   gr   r   r   	<genexpr>  s   zHTestPlotBase._check_grid_settings.<locals>.is_grid_on.<locals>.<genexpr>c             s   s   | ]}|j  V  qd S )N)r   )rF   r   r   r   r   r     s   )allr6   Zgcarg   Zget_major_ticksrh   )ZxoffZyoff)r-   r   r   
is_grid_on  s
    z5TestPlotBase._check_grid_settings.<locals>.is_grid_onro   r!   r=   F)gridr   T)r   r   Zpie)r(   r   r6   ZsubplotrI   ZrcZplotr;   )r-   objZkindsZkwsr/   r   Zspndxr   r   )r-   r   _check_grid_settings  s6    

z!TestPlotBase._check_grid_settingsr]   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   )rF   rR   )fieldr   r   rG     s    z/TestPlotBase._unpack_cycler.<locals>.<listcomp>zaxes.prop_cycler   )r-   ZrcParamsr   r   )r   r   _unpack_cycler  s    zTestPlotBase._unpack_cycler)NT)T)NNN)NNNN)rj   rj   )NNN)r   r   )NT)r]   )__name__
__module____qualname__r1   r3   r   r6   r8   rA   rJ   rQ   rW   r`   r<   ri   rk   rn   rl   r:   rw   r   r   r   r   r   r   r   r   0   s.   !

 
> 
1
 
!

 
9*r   alwaysc          
   K   s   dd l m} d }t  t| zy|d }W n tk
rN   | }Y nX |  |d|	d}| f |}t
| y|	d|d< | f |}W n tk
r   Y n
X t
| tdd}|| W d Q R X W d t| X |S Q R X d S )Nr   rm   r@         T)Zreturn_filelike)r4   r5   warningscatch_warningssimplefilterKeyErrorZgcfZclfgetZadd_subplotr	   	Exceptionr
   Zsavefigr+   r2   )ffilterwarningskwargsr6   ZretZfigr@   pathr   r   r   _check_plot_works  s.    


r   c              C   s   t jt jt\} }| S )N)osr   splitabspath__file__)Zpth_r   r   r   curpath  s    r   )r   )$r   r   Znumpyr,   r   r   Zpandas.compatr   r   Zpandas.util._decoratorsr   Zpandas.util._test_decoratorsutilZ_test_decoratorsZtdZpandas.core.dtypes.apir   Zpandasr   r   Zpandas.util.testingZtestingr+   r	   r
   Zpandas.plottingr)   Zpandas.plotting._toolsr   r   r   Zskip_if_no_mplobjectr   r   r   r   r   r   r   <module>   s,   
   N
"