U
    ~fh%;                     @  sL  d dl mZ d dlmZmZ d dlZd dlmZ d dl	m
Z
mZ d dlmZmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZmZ d dlmZ d dlmZmZmZm Z  erd dl!m"Z" d dl#m$Z$ G dd deZ%G dd de%Z&d'dddddddZ'd(dddddddddZ(d)dddd!d"d#Z)d*dddddd$d%d&Z*dS )+    )annotations)TYPE_CHECKINGLiteralN)PlottingOrientation)
is_integeris_list_like)ABCDataFrameABCIndex)isnaremove_na_arraylike)pprint_thing)LinePlotMPLPlot)create_iter_data_given_byreformat_hist_y_given_by)unpack_single_str_list)create_subplotsflatten_axesmaybe_adjust_figureset_ticks_props)Axes)	DataFramec                   @  s   e Zd ZeddddZd$ddd	d
ddZd	dddZdddddZed%dddddZ	d	dddZ
dd Zdd	ddd Zed!dd"d#ZdS )&HistPlotzLiteral[('hist', 'kde')]returnc                 C  s   dS )Nhist selfr   r   D/tmp/pip-unpacked-wheel-a5acpmi0/pandas/plotting/_matplotlib/hist.py_kind1   s    zHistPlot._kind
   r   z#int | np.ndarray | list[np.ndarray]zint | np.ndarrayNone)binsbottomr   c                 K  s8   || _ || _|d| _|d| _tj| |f| d S )Nxlabelylabel)r#   r$   getr%   r&   r   __init__)r   datar#   r$   kwargsr   r   r   r(   5   s
    zHistPlot.__init__c                   sp   t  jrT jd k	rFt j} j| j } fdd|D  _n  j _t j	rlt
 j	 _	d S )Nc                   s   g | ]\}}  |qS r   )_calculate_bins).0keygroupr   r   r   
<listcomp>J   s     z)HistPlot._args_adjust.<locals>.<listcomp>)r   r#   byr   r)   groupbycolumnsr+   r   r$   nparray)r   Zby_modifiedgroupedr   r   r   _args_adjustC   s    



zHistPlot._args_adjustr   z
np.ndarray)r)   r   c                 C  sL   |j dd }t|}|t|  }tj|| j| jddd\}}|S )zCalculate bins given dataF)copyrangeN)r#   r8   )	Zinfer_objects_get_numeric_datar3   Zravelr
   Z	histogramr#   kwdsr'   )r   r)   Z	nd_valuesvaluesr   r#   r   r   r   r+   Q   s    
  
zHistPlot._calculate_binsNint)r$   
column_numc                K  sx   |dkr|  ||t|d  tt|d }	|| |||	|d  }|j|f||d|\}
}}| |||
 |S )Nr      label)r#   r$   )Z_initialize_stackerlenr3   zerosZ_get_stacked_valuesr   Z_update_stacker)clsaxystyler$   r=   stacking_idr#   r:   basenZpatchesr   r   r   _plot]   s    zHistPlot._plotc                 C  s  |   }|  }| jd k	r(t| j| jn| j}t| j|dD ]\}\}}| |}| j	
 }t|}| j||d}||d< | ||||\}	}|	d k	r|	|d< | ||}| jd k	r|d | |d< | j|d< |d |dd }
|
d k	rpt|
dkrZt|
d	 dkrZz|
d d |f }
W n. tk
rX } ztd
|W 5 d }~X Y nX |
t|  }
|
|d< t|| j}| j||f||d|}| jd k	r|t| | |d | q>d S )N)r)   )indexr?   rE   r#   colorweightsr>   z?weights must have the same shape as data, or be a single column)r=   rF   r   )Z_get_colorsZ_get_stacking_idr0   r   r)   r    	enumerateZ
_iter_dataZ_get_axr:   r7   r   Z_mark_right_labelZ_apply_style_colors_make_plot_keywordsr2   popr'   r3   ndimshape
IndexError
ValueErrorr
   r   rI   	set_titleZ_append_legend_handles_labels)r   colorsrF   r)   ir?   rD   rC   r:   rE   rL   errZartistsr   r   r   
_make_plott   sL    





$zHistPlot._make_plotc                 C  s   | j |d< | j|d< |S )z/merge BoxPlot/KdePlot properties to passed kwdsr$   r#   )r$   r#   r   r:   rD   r   r   r   rO      s    

zHistPlot._make_plot_keywordsr   )rC   r   c                 C  s\   | j dkr2|| jd krdn| j || j n&|| j || jd krPdn| j d S )N
horizontalZ	Frequency)orientationZ
set_xlabelr%   
set_ylabelr&   r   rC   r)   r   r   r   _post_plot_logic   s
    
zHistPlot._post_plot_logicr   c                 C  s   | j dd dkrdS dS d S )Nr\   r[   vertical)r:   r'   r   r   r   r   r\      s    zHistPlot.orientation)r!   r   )Nr   r   N)__name__
__module____qualname__propertyr    r(   r6   r+   classmethodrI   rY   rO   r_   r\   r   r   r   r   r   0   s$         ;r   c                   @  sz   e Zd ZeddddZeddddZdd	dd
dZd	dddZdd Ze	dddZ
dd Zd	dddZdS )KdePlotzLiteral['kde']r   c                 C  s   dS )NZkder   r   r   r   r   r       s    zKdePlot._kindzLiteral['vertical']c                 C  s   dS )Nr`   r   r   r   r   r   r\      s    zKdePlot.orientationNr"   c                 K  s    t j| |f| || _|| _d S N)r   r(   	bw_methodind)r   r)   rh   ri   r*   r   r   r   r(      s    zKdePlot.__init__c                 C  s   d S rg   r   r   r   r   r   r6      s    zKdePlot._args_adjustc                 C  s   | j d krJt|t| }tt|d|  t|d|  d}nRt| j rt|t| }tt|d|  t|d|  | j }n| j }|S )N      ?i  )ri   r3   ZnanmaxZnanminZlinspacer   )r   rD   Zsample_rangeri   r   r   r   _get_ind   s     

zKdePlot._get_indc                 K  sH   ddl m}	 t|}|	||d}
|
|}tj|||fd|i|}|S )Nr   )gaussian_kde)rh   rE   )Zscipy.statsrl   r   evaluater   rI   )rB   rC   rD   rE   rh   ri   r=   rF   r:   rl   Zgkdelinesr   r   r   rI      s    
zKdePlot._plotc                 C  s   | j |d< | ||d< |S )Nrh   ri   )rh   rk   rZ   r   r   r   rO     s    
zKdePlot._make_plot_keywordsc                 C  s   | d d S )NZDensity)r]   r^   r   r   r   r_     s    zKdePlot._post_plot_logic)NN)NNNNN)ra   rb   rc   rd   r    r\   r(   r6   rk   re   rI   rO   r_   r   r   r   r   rf      s         rf   Tboolfloat)numeric_onlysharexshareyrotc                 K  s   |dkrt d||}|d k	r*|| }t|}t|||||
|d\}}t|}t|D ]F\}\}}|| }
|rt|tr| }| ||
f| |
	t
| qZ||fS )NdefaultzNfigsize='default' is no longer supported. Specify figure size by tuple instead)naxesfigsizerr   rs   rC   layout)rT   r1   r@   r   r   rN   
isinstancer   r9   rU   r   )Zplotfr)   columnr0   rq   rw   rr   rs   rx   rt   rC   r*   r5   rv   figaxes_axesrW   r-   r.   r   r   r   _grouped_plot
  s0    
     
r~   2   FZ   r<   )r#   rr   rs   rt   gridlegendc                   s   rBdkst | jdkr&| jd< n|dkr:| jd< n|d< dd fdd}|dkrd|	}t|| ||||||||	d
\}}t|||||d	 t|d
dddddd |S )a  
    Grouped histogram

    Parameters
    ----------
    data : Series/DataFrame
    column : object, optional
    by : object, optional
    ax : axes, optional
    bins : int, default 50
    figsize : tuple, optional
    layout : optional
    sharex : bool, default False
    sharey : bool, default False
    rot : float, default 90
    grid : bool, default True
    legend: : bool, default False
    kwargs : dict, keyword arguments passed to matplotlib.Axes.hist

    Returns
    -------
    collection of Matplotlib Axes
    r?   r>   Nr"   r   c                   s,   |j |  jfd i r(|  d S )Nr#   )r   dropnar;   r   )r.   rC   r#   r*   r   r   r   
plot_groupg  s    z!_grouped_hist.<locals>.plot_group)rz   r0   rr   rs   rC   rw   rx   rt   
xlabelsizexrot
ylabelsizeyrotg333333?g?g?rj   333333?)r$   topleftrighthspacewspace)AssertionErrorrQ   namer2   r~   r   r   )r)   rz   r0   rC   r#   rw   rx   rr   rs   rt   r   r   r   r   r   r   r*   r   r{   r|   r   r   r   _grouped_hist4  sN    *

          r   r!   )r   r#   r   c                 K  s  dd l m} |
r d|kr td|d kr|dd d k	rBtd|d| rX| n
|j|d}|d k	rt|t|	 kr|j
|dd	i |d kr| }n| |krtd
|  j}|
r| j|d< |j|fd|	i| |
r|  || t|g}t|||||d n8d|kr.tdt| f|||||	|||||
d
|}t|dr|jdkrt|dkr|d S |S )Nr   r?    Cannot use both legend and labelrx   z7The 'layout' keyword is not supported when 'by' is Nonefigure)rw   ZforwardTz&passed axis not bound to passed figurer#   r   z`Cannot pass 'figure' when using the 'by' argument, since a new 'Figure' instance will be created)
r0   rC   r   rw   r#   r   r   r   r   r   rQ   r>   )Zmatplotlib.pyplotZpyplotrT   r'   rP   Zget_fignumsZgcfr   tupleZget_size_inchesZset_size_inchesZgcaZ
get_figurer   r   r;   r   r   r   r   r3   r4   r   r   hasattrrQ   r@   )r   r0   rC   r   r   r   r   r   rw   r#   r   r:   Zpltr{   r;   r|   r   r   r   hist_series  sn    
 



    
r   )r   rr   rs   r#   r   c                 K  s`  |rd|krt d|d k	rNt| f||||||	|
|||||||d|}|S |d k	rvt|ttjtfsn|g}| | } | jtjddfdd} t	| j
}|dkrt d	t||d
|	|
||d\}}t|}d|k}t| j
D ]`\}}|| }|r|r||d< |j| |  jfd|i| || || |r|  qt|||||d t|ddd |S )Nr?   r   )rz   r0   rC   r   rw   rr   rs   rx   r#   r   r   r   r   r   Z
datetime64Z
datetimetz	timedelta)includeexcluder   zDhist method requires numerical or datetime columns, nothing to plot.F)rv   rC   Zsqueezerr   rs   rw   rx   r#   r   r   )r   r   )rT   r   ry   listr3   Zndarrayr	   Zselect_dtypesnumberr@   r2   r   r   rN   r   r   r;   rU   r   r   r   r   )r)   rz   r0   r   r   r   r   r   rC   rr   rs   rw   rx   r#   r   r:   r|   rv   r{   r}   Zcan_set_labelrW   colr   r   r   
hist_frame  s    
 

	 


    r   )	NNTNTTNr   N)NNNr   NNFFr   TNNNNF)
NNTNNNNNr!   F)NNTNNNNNFFNNr!   F)+
__future__r   typingr   r   Znumpyr3   Zpandas._typingr   Zpandas.core.dtypes.commonr   r   Zpandas.core.dtypes.genericr   r	   Zpandas.core.dtypes.missingr
   r   Zpandas.io.formats.printingr   Z pandas.plotting._matplotlib.corer   r   Z#pandas.plotting._matplotlib.groupbyr   r   Z pandas.plotting._matplotlib.miscr   Z!pandas.plotting._matplotlib.toolsr   r   r   r   Zmatplotlib.axesr   Zpandasr   r   rf   r~   r   r   r   r   r   r   r   <module>   s    G         ,               T          J              