B ®@`›Sã@sÌdZddlZddlmZmZmZddlZddlZddl m Z ddl m m ZddlmZddlZddlmZmZmZddlmZer’ddlmZejGdd „d ƒƒZdd d „Zdd„Zdd„Zdd„Z dS)z² Module consolidating common testing functions for checking plotting. Currently all plotting tests are marked as slow via ``pytestmark = pytest.mark.slow`` at the module level. éN)Ú TYPE_CHECKINGÚSequenceÚUnion)Úcache_readonly)Ú is_list_like)Ú DataFrameÚSeriesÚ to_datetime)ÚAxesc@sðeZdZdZdd„Zdd„Zedd„ƒZedd „ƒZd3d d „Z d4dd„Z dd„Z d5dd„Z d6e dedfed dœdd„Zdd„Zd7dd„Zdd„Zd8dd„Zd9d!d"„Zd:d#d$„Zd%d&„Zd'd(„Zd;d*d+„ZdÚ TestPlotBasezE This is a common base class used for various plotting tests cCsNddl}ddlm}| ¡d|_d|_| ¡|_| ¡|_| ¡|_|  ¡|_ d|_ d|_ d|_ d|_ d }t d ¡Štjjd d g|d }tjjdddg|d }t||tjjdd|d tjjdd|d tjjd|d ttjj|j|j|tjdƒdœƒ|_WdQRXt ¡|_ttjjdd tjjdd t d¡tjjdd dœƒ|_dS)Nr)ÚcompatljÕ+2ZlÊRŠeöZéé)gš™™™™™@g333333@Úleftédé*ZMaleZFemale)ÚsizeÚAÚBÚCéBéé¡é )rÚdtype)ÚgenderÚ classroomÚheightZweightÚcategoryÚdatetimeé)rrr)Ú matplotlibZpandas.plotting._matplotlibr Z rcdefaultsZstart_date_to_int64Zend_date_to_int64Z mpl_ge_2_2_3Z mpl_ge_3_0_0Ú mpl_ge_3_1_0Z mpl_ge_3_2_0Z bp_n_objectsZpolycollection_factorÚdefault_figsizeZdefault_tick_positionÚtmZ RNGContextÚnpÚrandomÚchoicerÚnormalÚrandintr Zint64Zhist_dfZmakeTimeDataFrameZtdfÚuniformZarangeZ hexbin_df)ÚselfÚmethodÚmplr Únrr©r/ú@/tmp/pip-unpacked-wheel-q9tj5l6a/pandas/tests/plotting/common.pyÚ setup_method!sD         zTestPlotBase.setup_methodcCs t ¡dS)N)r$Úclose)r+r,r/r/r0Úteardown_methodVszTestPlotBase.teardown_methodcCsddlm}|S)Nr)Úmatplotlib.pyplotÚpyplot)r+Úpltr/r/r0r6Ys zTestPlotBase.pltcCsddlm}|jS)Nr)Zmatplotlib.colorsÚcolorsZcolorConverter)r+r7r/r/r0Úcolorconverter_s zTestPlotBase.colorconverterNTcCsj|r|dkrtdƒ‚| |¡}xF|D]>}|rR| ¡dk ssz5TestPlotBase._check_legend_marker..)r9Zget_legend_handles_labelsr<r;)r+rAZexpected_markersr@ZhandlesÚ_Úmarkersr/r/r0Ú_check_legend_marker|s  z!TestPlotBase._check_legend_markercsP| ¡}| ¡}dd„‰t|ƒt|ƒks,t‚‡fdd„t||ƒDƒt ¡dS)z¤ Check each axes has identical lines Parameters ---------- xp : matplotlib Axes object rs : matplotlib Axes object cSs | ¡}| ¡}t ||¡dS)N)Z get_xydatar$Úassert_almost_equal)ÚxplÚrslZxpdataZrsdatar/r/r0Ú check_linežsz,TestPlotBase._check_data..check_linecsg|]\}}ˆ||ƒ‘qSr/r/)rCrJrK)rLr/r0rE¤sz,TestPlotBase._check_data..N)Ú get_linesÚlenr<Úzipr$r2)r+ZxpÚrsZxp_linesZrs_linesr/)rLr0Ú _check_data’s zTestPlotBase._check_datacCsFddlm}t||ƒs$t|ƒs$|g}x|D]}| ¡|ks*t‚q*WdS)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.collectionsrRÚ isinstancerÚ get_visibler<)r+Ú collectionsr@rRÚpatchr/r/r0Ú_check_visible§s  zTestPlotBase._check_visibler )r>ÚfilledÚreturncCs:| |¡}x*|D]"}x|jD]}|j|kst‚qWqWdS)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:ZpatchesÚfillr<)r+r>rYrArWr/r/r0Ú_check_patches_all_filledºs   z&TestPlotBase._check_patches_all_filledcs*| ¡}tt||ƒƒ‰‡fdd„|jDƒS)Ncsg|] }ˆ|‘qSr/r/)rCÚv)Úmappedr/r0rEÑsz3TestPlotBase._get_colors_mapped..)ÚuniqueÚdictrOÚvalues)r+Zseriesr7r_r/)r^r0Ú_get_colors_mappedÌszTestPlotBase._get_colors_mappedcCsŽddlm}m}m}ddlm}|j} |dk rÚ|dk rR| ||¡}|dt|ƒ…}t|ƒt|ƒksft ‚xrt ||ƒD]d\} } t | |ƒr˜|   ¡} |   | ¡} n(t | ||fƒr¸t|  ¡dƒ} n|  ¡} |   | ¡} | | ksrt ‚qrW|dk rŠ|dk r | ||¡}|dt|ƒ…}t|ƒt|ƒks t ‚xht ||ƒD]Z\} } t | |ƒrN|  ¡d} n|  ¡} t | tjƒrlt| ƒ} |   | ¡} | | ks,t ‚q,WdS)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)rRÚLineCollectionÚPolyCollection)ÚLine2DN)rSrRrcrdZmatplotlib.linesrer8rbrNr<rOrTZ get_colorZto_rgbaÚtupleZ get_edgecolorZ get_facecolorr%Zndarray)r+rVZ linecolorsZ facecolorsÚmappingrRrcrdreÚconvrWÚcolorÚresultÚexpectedr/r/r0Ú _check_colorsÓs<          zTestPlotBase._check_colorscCsdt|ƒs| ¡|ks`t‚nFdd„|Dƒ}t|ƒt|ƒks.N)rrmr<rNrO)r+Ztextsrkr?ÚlabelÚer/r/r0r=s zTestPlotBase._check_text_labelsc Cs&ddlm}| |¡}x|D]þ}|dk s4|dk r t|j ¡|ƒrN| ¡}n| ¡|jdd}x<|D]4} |dk r„t |   ¡|¡|dk rht |   ¡|¡qhW|dk s°|dk rt|j  ¡|ƒrÊ|  ¡}n|  ¡|j dd}x>|D]6} |dk rt |   ¡|¡|dk rät |   ¡|¡qäWqWdS)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) Zmatplotlib.tickerrqr:rTÚxaxisZget_minor_formatterZget_xticklabelsr$rIZ get_fontsizeZ get_rotationÚyaxisZget_yticklabels) r+r>Z xlabelsizeZxrotZ ylabelsizeZyrotrqrAr?ror/r/r0Ú_check_ticks_props$s*       zTestPlotBase._check_ticks_propsÚlinearcCs@| |¡}x0|D](}|j ¡|ks&t‚|j ¡|kst‚qWdS)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:rsZ get_scaler<rt)r+r>rsrtrAr/r/r0Ú_check_ax_scalesTs  zTestPlotBase._check_ax_scalesc Cs¦ddlm}|dkr|j}| |¡}|dk r^t|ƒ|ksZaxes_numZlayoutZfigsizerxZ visible_axesrArjr/r/r0Ú_check_axes_shapees     zTestPlotBase._check_axes_shapecCsZtƒ}tƒ}x<|D]4}| ¡ ¡}| |dd¡| |dd¡qWt|ƒt|ƒfS)Nré)ÚsetÚ get_positionZ get_pointsÚaddrN)r+r>Zx_setZy_setrAZpointsr/r/r0rz‰s  zTestPlotBase._get_axes_layoutcCs&ddlm}||ƒ}dd„|Dƒ}|S)z— Flatten axes, and filter only visible Parameters ---------- axes : matplotlib Axes object, or its list-like r)rxcSsg|]}| ¡r|‘qSr/)rU)rCrAr/r/r0rEŸsz1TestPlotBase._flatten_visible..)ryrx)r+r>rxr/r/r0r:“s zTestPlotBase._flatten_visiblerc Cs€| |¡}xp|D]h}|j}d}d}x<|D]4}t|ddƒ} t|ddƒ} | rP|d7}| r(|d7}q(W||kslt‚||kst‚qWdS)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_yerrr~N)r:Ú containersÚgetattrr<) r+r>ZxerrZyerrrAr„Z xerr_countZ yerr_countÚcr‚rƒr/r/r0Ú_check_has_errorbars¢s       z!TestPlotBase._check_has_errorbarsc Cs’ddlm}t|tdœ}|dkrj|dkr,d}t|||ƒs>t‚|dkrft|j|ƒsVt‚t|jtƒsft‚n$|dkr˜x | |¡D]}t||ƒs~t‚q~WdSt|t ƒs¦t‚t |  ¡ƒt |ƒks¾t‚xÎ|  ¡D]Â\}} t| ||ƒsât‚|dkr|rŠ|   ¡|ksŠt‚qÈ|dkrP|r*| j  ¡|ks*t‚t| j|ƒsÚbothNr`rˆr>Zmedians)Úmatplotlib.axesr r`rfrTr<rAÚlinesr:rÚsortedÚkeysÚitemsZ get_titler>) r+ZreturnedÚ return_typeZ expected_keysZcheck_ax_titler ÚtypesÚrÚkeyÚvalueÚliner>r/r/r0Ú_check_box_return_type½s>      z#TestPlotBase._check_box_return_typecslddl}‡fdd„}d}xL|D]B}ˆj ddt|ƒ|¡|d7}|jddd|jfd |i|—Ž|ƒrrt‚ˆj ddt|ƒ|¡|d7}|jdd d|jf|dd œ|—Ž|ƒrÀt‚|d kr ˆj ddt|ƒ|¡|d7}|jdd d|jfd |i|—Ž|ƒst‚ˆj ddt|ƒ|¡|d7}|jddd|jf|d d œ|—Ž|ƒs t‚q WdS) Nrcszˆj ¡j ¡}ˆj ¡j ¡}ˆjrLtdd„|Dƒƒ}tdd„|Dƒƒ}n$tdd„|Dƒƒ}tdd„|Dƒƒ}|ov| S)Ncss|]}|j ¡ VqdS)N)ÚgridlinerU)rCÚgr/r/r0ú szHTestPlotBase._check_grid_settings..is_grid_on..css|]}|j ¡ VqdS)N)r•rU)rCr–r/r/r0r—scss|]}|j VqdS)N)ÚgridOn)rCr–r/r/r0r—scss|]}|j VqdS)N)r˜)rCr–r/r/r0r— s)r6ZgcarsZget_major_ticksrtr"Úall)ZxticksZyticksZxoffZyoff)r+r/r0Ú is_grid_onþsz5TestPlotBase._check_grid_settings..is_grid_onr~rr>F)ÚgridÚkindT)rœr›Zpie)r!r6ZsubplotrNÚrcZplotr<)r+ÚobjÚkindsÚkwsr-ršZspndxrœr/)r+r0Ú_check_grid_settingsùs2    z!TestPlotBase._check_grid_settingsrics‡fdd„|dDƒS)zT Auxiliary function for correctly unpacking cycler after MPL >= 1.5 csg|] }|ˆ‘qSr/r/)rCr])Úfieldr/r0rE-sz/TestPlotBase._unpack_cycler..zaxes.prop_cycler/)r+ZrcParamsr¢r/)r¢r0Ú_unpack_cycler)szTestPlotBase._unpack_cycler)NT)NT)T)T)NNN)NNNN)rvrv)NNN)rr)NT)ri)Ú__name__Ú __module__Ú __qualname__Ú__doc__r1r3rr6r8rBrHrQrXrrÚboolr\rbrlr=rurwr}rzr:r‡r”r¡r£r/r/r/r0r s.5      = /  $   ; 0r ÚalwaysFc KsÚddlm}|rt}nt}d}t ¡ªt |¡zŒy`| d| ¡¡}|  ¡x |||f|ŽD]}t   |¡q^Wt j dd}|  |¡WdQRXWn&tk rº} z| ‚Wdd} ~ XYnXWdt  |¡X|SQRXdS)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. rNr{T)Zreturn_filelike)r4r5Ú_gen_default_plotÚ_gen_two_subplotsÚwarningsÚcatch_warningsÚ simplefilterÚgetZgcfZclfr$Z"assert_is_valid_plot_return_objectZ ensure_cleanZsavefigÚ Exceptionr2) ÚfÚfilterwarningsZ default_axesÚkwargsr6Z gen_plotsÚretÚfigÚpathÚerrr/r/r0Ú_check_plot_works0s$    r¸cks|f|ŽVdS)z' Create plot in a default way. Nr/)r±rµr³r/r/r0rªjsrªcksV| d| d¡¡|f|ŽV|tjjkr8d|ksFt‚n| d¡|d<|f|ŽVdS)z9 Create plot on two subplots forcefully created. rAéÓéÔN)r¯Z add_subplotÚpdZplottingZbootstrap_plotr<)r±rµr³r/r/r0r«qs   r«cCstj tj t¡¡\}}|S)N)Úosr¶ÚsplitÚabspathÚ__file__)ÚpthrFr/r/r0ÚcurpathsrÁ)r©F)!r§r¼Útypingrrrr¬Znumpyr%Zpandas.util._decoratorsrZpandas.util._test_decoratorsÚutilZ_test_decoratorsÚtdZpandas.core.dtypes.apirZpandasr»rrr Zpandas._testingZ_testingr$r‰r Zskip_if_no_mplr r¸rªr«rÁr/r/r/r0Ús*     :