o
    d%;                     @  s  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rfd 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Z'															d,d-d#d$Z(									%	d.d/d&d'Z)													%	d0d1d(d)Z*dS )2    )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Z		d&d'ddZd(ddZd)ddZe				d*d+ddZ	d(ddZ
dd Zd,d d!Zed-d#d$ZdS ).HistPlotreturnLiteral['hist', 'kde']c                 C     dS )Nhist selfr   r   T/app/.heroku/python/lib/python3.10/site-packages/pandas/plotting/_matplotlib/hist.py_kind1      zHistPlot._kind
   r   bins#int | np.ndarray | list[np.ndarray]bottomint | np.ndarrayNonec                 K  s<   || _ || _|d| _|d| _tj| |fi | d S )Nxlabelylabel)r$   r&   getr)   r*   r   __init__)r   datar$   r&   kwargsr   r   r    r,   5   s
   zHistPlot.__init__c                   st   t  jr* jd ur#t j} j| j } fdd|D  _n  j _t j	r8t
 j	 _	d S 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-   r   
np.ndarrayc                 C  sL   |j dd }t|}|t|  }tj|| j| jddd\}}|S )zCalculate bins given dataF)copyrangeN)r$   r=   )	Zinfer_objects_get_numeric_datar7   Zravelr
   Z	histogramr$   kwdsr+   )r   r-   Z	nd_valuesvaluesr   r$   r   r   r    r/   Q   s   

zHistPlot._calculate_binsN
column_numintc                K  sx   |dkr|  ||t|d  tt|d }	|| |||	|d  }|j|f||d|\}
}}| |||
 |S )Nr      label)r$   r&   )Z_initialize_stackerlenr7   ZzerosZ_get_stacked_valuesr   Z_update_stacker)clsaxystyler&   rA   stacking_idr$   r?   basenZpatchesr   r   r    _plot]   s   zHistPlot._plotc                 C  s  |   }|  }| jd urt| j| jn| j}t| j|dD ]\}\}}| |}| j	
 }t|}| j||d}||d< | ||||\}	}|	d urP|	|d< | ||}| jd urm|d | |d< | j|d< |d |dd }
|
d urt|
dkrt|
d	 dkrz
|
d d |f }
W n ty } ztd
|d }~ww |
t|  }
|
|d< t|| j}| j||f||d|}| jd ur|t| | |d | qd S )N)r-   )indexrD   rI   r$   colorweightsrC   z?weights must have the same shape as data, or be a single column)rA   rJ   r   )Z_get_colorsZ_get_stacking_idr4   r   r-   r!   	enumerateZ
_iter_dataZ_get_axr?   r<   r   Z_mark_right_labelZ_apply_style_colors_make_plot_keywordsr6   popr+   r7   ndimshape
IndexError
ValueErrorr
   r   rM   	set_titleZ_append_legend_handles_labels)r   colorsrJ   r-   irD   rH   rG   r?   rI   rP   errZartistsr   r   r    
_make_plott   sR   




 
zHistPlot._make_plotc                 C  s   | j |d< | j|d< |S )z/merge BoxPlot/KdePlot properties to passed kwdsr&   r$   )r&   r$   r   r?   rH   r   r   r    rS      s   

zHistPlot._make_plot_keywordsrG   r   c                 C  s^   | j dkr|| jd u rdn| j || j d S || j || jd u r)dn| j d S )N
horizontalZ	Frequency)orientationZ
set_xlabelr)   
set_ylabelr*   r   rG   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 )Nr`   r_   vertical)r?   r+   r   r   r   r    r`      s   zHistPlot.orientation)r   r   )r#   r   )r$   r%   r&   r'   r   r(   r   r(   )r-   r   r   r;   )Nr   r   N)r&   r'   rA   rB   )rG   r   r   r(   )r   r   )__name__
__module____qualname__propertyr!   r,   r:   r/   classmethodrM   r]   rS   rc   r`   r   r   r   r    r   0   s&    


;
r   c                   @  sp   e Zd ZedddZedddZddd
dZdddZdd Ze						dddZ
dd ZdddZdS )KdePlotr   Literal['kde']c                 C  r   )NZkder   r   r   r   r    r!      r"   zKdePlot._kindLiteral['vertical']c                 C  r   )Nrd   r   r   r   r   r    r`      r"   zKdePlot.orientationNr(   c                 K  s$   t j| |fi | || _|| _d S N)r   r,   	bw_methodind)r   r-   ro   rp   r.   r   r   r    r,      s   
zKdePlot.__init__c                 C  s   d S rn   r   r   r   r   r    r:      s   zKdePlot._args_adjustc                 C  s   | j d u r&t|t| }tt|d|  t|d|  d}|S t| j rMt|t| }tt|d|  t|d|  | j }|S | j }|S )N      ?i  )rp   r7   ZnanmaxZnanminZlinspacer   )r   rH   Zsample_rangerp   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)ro   rI   )Zscipy.statsrs   r   evaluater   rM   )rF   rG   rH   rI   ro   rp   rA   rJ   r?   rs   Zgkdelinesr   r   r    rM      s   
zKdePlot._plotc                 C  s   | j |d< | ||d< |S )Nro   rp   )ro   rr   r^   r   r   r    rS     s   
zKdePlot._make_plot_keywordsc                 C  s   | d d S )NZDensity)ra   rb   r   r   r    rc     s   zKdePlot._post_plot_logic)r   rl   )r   rm   )NNre   )NNNNN)rf   rg   rh   ri   r!   r`   r,   r:   rr   rj   rM   rS   rc   r   r   r   r    rk      s"    
rk   Tnumeric_onlyboolsharexshareyrotfloatc                 K  s   |dkrt d||}|d ur|| }t|}t|||||
|d\}}t|}t|D ]%\}\}}|| }
|rBt|trB| }| ||
fi | |
	t
| q-||fS )NdefaultzNfigsize='default' is no longer supported. Specify figure size by tuple instead)naxesfigsizerx   ry   rG   layout)rX   r5   rE   r   r   rR   
isinstancer   r>   rY   r   )Zplotfr-   columnr4   rv   r~   rx   ry   r   rz   rG   r.   r9   r}   figaxes_axesr[   r1   r2   r   r   r    _grouped_plot
  s&   

r   2   FZ   r$   rB   gridlegendc                   s   r!dvsJ | j dkr| jd< n|du r| jd< n|d< d fdd}|du r0|	}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
    rD   rC   Nr   r(   c                   s0   |j |  jfd i r|  d S d S )Nr$   )r   dropnar@   r   )r2   rG   r$   r.   r   r   r    
plot_groupg  s   z!_grouped_hist.<locals>.plot_group)r   r4   rx   ry   rG   r~   r   rz   
xlabelsizexrot
ylabelsizeyrotg333333?g?g?rq   333333?)r&   topleftrighthspacewspacere   )rU   namer6   r   r   r   )r-   r   r4   rG   r$   r~   r   rx   ry   rz   r   r   r   r   r   r   r.   r   r   r   r   r   r    _grouped_hist4  s:   *


r   r#   c                 K  s|  dd l m} |
rd|v rtd|d u r|dd d ur td|d| r+| n|j|d}|d urHt|t|	 krH|j
|dd	i |d u rQ| }n
| |kr[td
|  j}|
rg| j|d< |j|fd|	i| |
rx|  || t|g}t|||||d nd|v rtdt| f|||||	|||||
d
|}t|dr|jdkrt|dkr|d S |S )Nr   rD    Cannot use both legend and labelr   z7The 'layout' keyword is not supported when 'by' is Nonefigure)r~   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)
r4   rG   r   r~   r$   r   r   r   r   r   rU   rC   )Zmatplotlib.pyplotZpyplotrX   r+   rT   Zget_fignumsZgcfr   tupleZget_size_inchesZset_size_inchesZgcaZ
get_figureAssertionErrorr   r@   r   r   r   r   r7   r8   r   r   hasattrrU   rE   )r   r4   rG   r   r   r   r   r   r~   r$   r   r?   Zpltr   r@   r   r   r   r    hist_series  sd   





r   c                 K  s`  |r
d|v r
t d|d ur't| f||||||	|
|||||||d|}|S |d ur;t|ttjtfs7|g}| | } | jtjddfdd} t	| j
}|dkrSt d	t||d
|	|
||d\}}t|}d|v}t| j
D ]0\}}|| }|r}|r}||d< |j| |  jfd|i| || || |r|  qmt|||||d t|ddd |S )NrD   r   )r   r4   rG   r   r~   rx   ry   r   r$   r   r   r   r   r   Z
datetime64Z
datetimetz	timedelta)includeexcluder   zDhist method requires numerical or datetime columns, nothing to plot.F)r}   rG   Zsqueezerx   ry   r~   r   r$   r   r   )r   r   )rX   r   r   listr7   Zndarrayr	   Zselect_dtypesnumberrE   r6   r   r   rR   r   r   r@   rY   r   r   r   r   )r-   r   r4   r   r   r   r   r   rG   rx   ry   r~   r   r$   r   r?   r   r}   r   r   Zcan_set_labelr[   colr   r   r    
hist_frame  s|   

	 


r   )	NNTNTTNr   N)rv   rw   rx   rw   ry   rw   rz   r{   )NNNr   NNFFr   TNNNNF)r$   rB   rx   rw   ry   rw   rz   r{   r   rw   r   rw   )
NNTNNNNNr#   F)r   rw   r$   rB   r   rw   )NNTNNNNNFFNNr#   F)
r   rw   rx   rw   ry   rw   r$   rB   r   rw   )+
__future__r   typingr   r   numpyr7   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   rk   r   r   r   r   r   r   r   r    <module>   s     G,TJ