a
    ~b^                     @   s`  d dl mZmZmZ d dlmZ d dlmZ d dlZd dl	Z
d dlmZmZmZmZ ddlmZ dd	l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mZmZm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4 G dd de&Z5G dd de,Z6G dd de(e)e*Z7G dd de7Z8dS )    )absolute_importdivisionunicode_literals)defaultdict)partialN)FactorRangeCircleVBarHBar   )BokehOverlaySelectionDisplay   )	NdOverlay)	DimensionDimensioned)sorted_context)
basestringdimension_sanitizer
wrap_tupleunique_iteratorisfiniteis_dask_arrayis_cupy_array)univariate_kde)dim)AreaPlot)CompositeElementPlotColorbarPlot
LegendPlot)PolygonPlot)base_propertiesfill_propertiesline_properties)LooseVersionbokeh_versiondecode_bytesc                   @   s@   e Zd ZdZejdddZejdddZejdddZ	e
 ZdS )	DistributionPlotzH
    DistributionPlot visualizes a distribution of values as a KDE.
    N>
        The bandwidth of the kernel for the density estimate.defaultdocr   D
        Draw the estimate to cut * bw from the extreme data points.T9
        Whether the bivariate contours should be filled.)__name__
__module____qualname____doc__paramNumber	bandwidthcutBooleanfilledr   selection_display r8   r8   =lib/python3.9/site-packages/holoviews/plotting/bokeh/stats.pyr&      s
   r&   c                   @   sZ   e Zd ZdZejdddZejdddZejdddZ	ej
d	eefd
dZedddZdS )BivariatePlotz
    Bivariate plot visualizes two-dimensional kernel density
    estimates. Additionally, by enabling the joint option, the
    marginals distributions can be plotted alongside each axis (does
    not animate or compose).
    Nr'   r(   r   r+   Fr,   
   zD
        A list of scalar values used to specify the contour levels.r)   class_r*   cmapT)
color_propZis_cmap)r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   ClassSelectorlistintZlevelsr   r7   r8   r8   r8   r9   r:   -   s   r:   c                       s   e Zd ZejdddZejdeefdddZ	e
Zdd	d	d
dZdd ee D dd ee e D  dd ee D  g d Zeg d ZdZeddZd% fdd	Zdd Zd&ddZd' fdd	Zdd Z fdd Zd!d" Zd#d$ Z  ZS )(BoxWhiskerPlotFz-
        Whether to show legend for the plot.r(   NTzR
        Deprecated in favor of color style mapping, e.g. `box_color=dim('color')`r)   r=   Z
allow_Noner*   ZwhiskerboxZoutlier)segmentvbarhbarcirclec                 C   s   g | ]}d | qS )Zwhisker_r8   .0pr8   r8   r9   
<listcomp>U       zBoxWhiskerPlot.<listcomp>c                 C   s   g | ]}d | qS )box_r8   rJ   r8   r8   r9   rM   V   rN   c                 C   s   g | ]}d | qS )Zoutlier_r8   rJ   r8   r8   r9   rM   W   rN   )	box_widthr>   box_cmap)rP   whisker_widthr>   rQ   Z	box_colorr?   combinedc                    s   t t| |||d|jd S )NZcategoricalr   )superrC   get_extentsvdims)selfelementrangesZ
range_type	__class__r8   r9   rV   `   s    
zBoxWhiskerPlot.get_extentsc                 C   s   |j |jd fS )Nr   )kdimsrW   )rX   rY   r8   r8   r9   _get_axis_dimse   s    zBoxWhiskerPlot._get_axis_dimsc           	      C   s@   t ||d}| jr<|js<| jr<ttdkr.dnd}|j||< |S )N)source1.3.5Zlegend_labellegend)dictshow_legendr]   Zoverlaidr$   r#   label)	rX   ZplotrY   r_   rZ   stylegroupZ
propertieslegend_propr8   r8   r9   _glyph_propertiesh   s
    
z BoxWhiskerPlot._glyph_propertiesc                    s^   |j dkr|jtjd}n,|jtjd}t|tr8|}n||fg}tt| 	|||||S )Nr   )function)
ndimsZ	aggregatenpZmean
isinstancer   clonerU   rC   _apply_transforms)rX   rY   datarZ   re   rf   Zaggr[   r8   r9   rn   o   s    

z BoxWhiskerPlot._apply_transformsc                    s    j s jgg  }}nXdd   j j D } jdkrDt|} fdd|D }dd |D }|g  }}| jr|||fS ||fS )3
        Get factors for categorical axes.
        c                 S   s   g | ]}|qS r8   r8   rK   keyr8   r8   r9   rM      rN   z/BoxWhiskerPlot._get_factors.<locals>.<listcomp>r   c                    s&   g | ]}t d d t j|D qS )c                 s   s   | ]\}}| |V  qd S Npprint_valuerK   dkr8   r8   r9   	<genexpr>   rN   z9BoxWhiskerPlot._get_factors.<locals>.<listcomp>.<genexpr>)tuplezipr]   rq   rY   r8   r9   rM      s   c                 S   s$   g | ]}t |d kr|d n|qS r   r   lenrK   fr8   r8   r9   rM      rN   )r]   rd   groupbyro   keysrj   sortedinvert_axesrX   rY   rZ   ZxfactorsZyfactorsfactorsr8   r|   r9   _get_factorsz   s    


zBoxWhiskerPlot._get_factorsc                    s,   t |jtttfsd S tt| || d S rs   )rl   glyphr   r	   r
   rU   rC   _postprocess_hover)rX   Zrendererr_   r[   r8   r9   r      s    z!BoxWhiskerPlot._postprocess_hoverc                    sP  t }t}t}|r.dd l}|j |j }n|rFdd lm} |j ntj | |sdtṙ fddt	dddD \}}}	|	| }
t
|	d|
  k 
 |	}t|d|
  k  |}nd\}}}	d\}}|k|k B  }|r"| | |	 | | ||fS |r<||||	|||S |||	|||fS d S )	Nr   c                 3   s   | ]} |d V  qdS )qNr8   rK   r   
percentilevalsr8   r9   ry      rN   z,BoxWhiskerPlot._box_stats.<locals>.<genexpr>   d   g      ?)r   r   r   )r   r   )r   r   r   cupyr   Z
dask.arrayarrayrk   r   rangemaxminitemZasnumpycompute)rX   r   Z	is_finiteZis_daskZis_cupyr   daq1q2q3Ziqrupperloweroutliersr8   r   r9   
_box_stats   s6    " 
zBoxWhiskerPlot._box_statsc           *      C   s  |j r>td ||j j}W d    qN1 s20    Y  nt|j|fg}t|jd j}dd t	dD \}}dd t	dD \}}	dd t	dD \}
}t
tdg |g i}|d	d
}|ddd }d|v r| jd | jrddd|d}ddddd}d|d}n&ddd|d}ddddd}d|d}t|}| jd urf|| j}|| j}nd\}}g }|jd j}| D ]\}}|j rtdd t|j |D }t|dkr|d }n|}d| jv }|d ur||jk r||t||  n
|| |jj||dd }| |\}}}}}} ||fD ]}!|!d | qB||	fD ]"}!|!d | |!d | q`|
|fD ]8}!|!d t|| f  |!d t||f  q|d | |d | |d | |d | |d | |	d | |d | |	d | |
d | |
d | |d | |d | t| r|d  |gt|  7  < ||  t| 7  < |rt|j t|D ]*\}"}#|t|"j  |#gt|  7  < q|rt|j t|D ]\\}"}#t|"j}$|$|v r*||$ |# n
|#g||$< |$|v rN||$ |# n
|#g||$< q||v rv|| | n
|g||< ||v r|| | n
|g||< q| jrd!nd"}%|%d# ||%d$ |d%|d&|	d'|
d(|d)|i}!|%d# ||%d$ |d%|d&|d'|d(|d)|i}&||||	|fD ](}'|' D ]\}#}(t !|(|'|#< q"q|j sR|!|&|fS |d u sh||jkrrt"d}n(||t|j< ||t|j< tt#|}| j$rt%d*krd+nd,})|j||)< |!|&|fS )-NFr   c                 s   s   | ]}g g g d V  qdS ))indextopbottomNr8   rK   ir8   r8   r9   ry      rN   z*BoxWhiskerPlot.get_data.<locals>.<genexpr>   c                 s   s   | ]}g g g g d V  qdS )x0y0x1y1Nr8   r   r8   r8   r9   ry      rN   c                 s   s   | ]}g g g g d V  qdS r   r8   r   r8   r8   r9   ry      rN   r   rP   gffffff?rR   g?g       @widthz>BoxWhisker width option is deprecated use 'box_width' instead.r   r   yleftrightZheightr   r   r   r   r   r   r   r   )r   x)r   r   r   r   r   r   r   r   r   r   )NNc                 s   s   | ]\}}| |V  qd S rs   rt   )rK   rw   vr8   r8   r9   ry      rN   r   hover)r   rH   rG   _1Z_2	segment_1Z	segment_2Z	segment_3Z	segment_4Zcircle_1r`   legend_fieldra   )&r]   r   r   ro   rb   rd   r   rW   namer   r   rA   getpopr1   Zwarningr   color_indexZget_dimensionZget_dimension_indexitemsrz   r{   r   Zhandlesrj   appendru   r   Z	interfacevaluesr   rk   r   r   r   rc   r$   )*rX   rY   rZ   re   groupsvdimZr1_dataZr2_dataZs1_dataZs2_dataZw1_dataZw2_dataZout_datar   rR   Zvbar_mapseg_mapZout_mapZ	vbar2_mapZcdimZcidxr   rr   grd   r   r   r   r   r   r   r   r   ro   kdrx   Zkd_name	bar_glyphmappingZgdatar   rg   r8   r8   r9   get_data   s    
.




$









zBoxWhiskerPlot.get_data)rT   )N)N)r-   r.   r/   r1   r5   rc   r@   r   rB   r   r   Z_x_range_type_style_groupsr    r"   r!   
style_optsZ_nonvectorized_stylesZ_stream_datar   r7   rV   r^   rh   rn   r   r   r   r   __classcell__r8   r8   r[   r9   rC   D   s0   

"rC   c                   @   s  e Zd ZejdddZejddddZejdddZej	g d	d
ddZ
ejdeefddZejdddZejdeefdddZdddd
dd
dZg dZdd ee e D dd ee D  dd dD  g d Zd d d!D Zed"d#Zd$d% Zd&d' Zd(d) Zd*d+ ZdS ),
ViolinPlotNzl
        Allows supplying explicit bandwidth value rather than relying
        on scott or silverman method.r(   r   zB
        A tuple of a lower and upper bound to clip the violin at.)r)   lengthr*      r+   )rE   	quartilesstickNrE   z
        Inner visual indicator for distribution values:

          * box - A small box plot
          * stick - Lines indicating each sample value
          * quartiles - Indicates first, second and third quartiles
        )Zobjectsr)   r*   z-
       The dimension to split the Violin on.r<   g?z$
       Relative width of the violinTzU
        Deprecated in favor of color style mapping, e.g. `violin_color=dim('color')`rD   violinoutlinestatsmedian)patches
multi_linerF   rG   scatterrH   )r   r   rF   rG   rH   rI   r   c                 C   s   g | ]}d D ]}|| qqS ))Zviolin_rO   r8   rK   rL   r   r8   r8   r9   rM   i  s   zViolinPlot.<listcomp>c                 C   s   g | ]}d D ]}|| qqS ))Zstats_Zoutline_r8   r   r8   r8   r9   rM   k  s   c                 C   s$   g | ]}d D ]}d ||gqqS ))rE   r   r   r   _)joinr   r8   r8   r9   rM   m  s   )ZcolorZalpha)r>   rQ   Zviolin_cmapc                 C   s   g | ]}t tj|d qS )r   )r   rk   r   r   r8   r8   r9   rM   q  rN   )r   2   K   violin_fill_colorrS   c                    s>   t | jtrt| jn| j  fdd|jD }||jd fS )Nc                    s   g | ]} r| j kr|qS r8   	dimensionrK   r   	split_dimr8   r9   rM   w  rN   z-ViolinPlot._get_axis_dims.<locals>.<listcomp>r   )rl   splitr   r   r]   rW   )rX   rY   r]   r8   r   r9   r^   u  s    zViolinPlot._get_axis_dimsc                    s   t | jtrt| jn| jfdd|jD   sD|jgg  }}nVdd | j D }|j	dkrpt
|} fdd|D }dd |D }|g  }}| jr||fS ||fS )rp   c                    s   g | ]} r| j kr|qS r8   r   r   r   r8   r9   rM     rN   z+ViolinPlot._get_factors.<locals>.<listcomp>c                 S   s   g | ]}|qS r8   r8   rq   r8   r8   r9   rM     rN   r   c                    s$   g | ]}t d d t |D qS )c                 s   s   | ]\}}| |V  qd S rs   rt   rv   r8   r8   r9   ry     rN   z5ViolinPlot._get_factors.<locals>.<listcomp>.<genexpr>)rz   r{   rq   r]   r8   r9   rM     s   c                 S   s$   g | ]}t |d kr|d n|qS r}   r~   r   r8   r8   r9   rM     rN   )rl   r   r   r   r]   rd   r   ro   r   rj   r   r   r   r8   )r]   r   r9   r   z  s    


zViolinPlot._get_factorsc           &         s  |j }|d }jr.|jd}|j|gd}|d ur|j|jd}||}	t|dkrttdt|d||	t
|t|j|	}t|f|jt
|d|}
d	n&d d g}d t|fd
|ji|i}
d||}g g g g f\}}}t|D ](\}}|
|  d u r0tg tg  }}n fddtdD \}}t||dk@ }|| ||  }}|dkr|d9 }n|d d d }|d d d }|rt|r||d gt| |d g  |dgt| dg  n|g  |g  |d d d }|t|7 }t|7 qt|}t|rfdd |D }fdd|D }trtt j  ng fddD |d}|r||d n| t|
trdd |D  t
|< tttti   }}}||}|t| }t|s"njdkrt|rjD ]j}||}tt|| }|| |  }}|d | |d |d  f  |d | q>njdkr.t|r|D ]b}tt|| }|| |  }}|d | |d |d  f  |d | qnjdkrd }|\} }!}"}#}$}%|d | |d |$ |d |# |d | |d |  |d |" ||d< |!|d<  ||||fS )Nr   )r   )rW   r   r   zcThe number of categories for split violin plots cannot be greater than 2. Found {0} categories: {1}z, )r   r      r   c                 3   s   | ]}  |V  qd S rs   )dimension_values)rK   Zidim)kder8   r9   ry     rN   z'ViolinPlot._kde_data.<locals>.<genexpr>c                 S   s   g | ]}t |qS r8   )rk   Zasarray)rK   r   r8   r8   r9   rM     rN   z(ViolinPlot._kde_data.<locals>.<listcomp>c                    sB   g | ]:}t |r: fd d|t  j  D ng qS )c                    s   g | ]} |f qS r8   r8   rK   r   rr   r8   r9   rM     rN   z3ViolinPlot._kde_data.<locals>.<listcomp>.<listcomp>)r   rk   absr   violin_width)rK   Zfy)rr   scalerX   ysr8   r9   rM     s   ,c                    s   g | ]} |f qS r8   r8   r   r   r8   r9   rM     rN   )r   xsc                 S   s   g | ]}t |qS r8   str)rK   rx   r8   r8   r9   rM     rN   r   r   r   r   r   rE   r   r   r   r   ) rW   cliprm   r]   applyr   
ValueErrorformatr   Zadd_dimensionreprr   r   r   	enumerater   rk   r   r   r   rA   Znanmaxr   r   rl   r   r   r   inner	_stat_fnsZargminr   )&rX   rY   elrr   r   
split_catskwargsrW   r   Zall_catsZkdesZx_ranger   Zfill_xsZfill_ysr   catZ_xsZ_ysmasklinebarssegmentsr   r   Zstat_fnstatZsidxZsxZsyvalueZxposr   r   r   r   r   r   r8   )r   rr   r   rX   r   r9   	_kde_data  s    






"



,





zViolinPlot._kde_datac           #   	      s4  t | jtrt| jn| j  fdd|jD }|rjtd ||j}W d    q|1 s^0    Y  nt|j	f|fg} rʈ j
j}||v r jsd|| v r|| d}qΈ rtt |}nd }| jr(ddddd	}d
dd}	| jdkr
ddddd}
nddddd}
ddd}d}nPddddd}dd
d}	| jdkr\ddddd}
nddddd}
ddd}d}| j| jd}i i  }}dd tdD \}}}}}t| D ],\}\}}t|}|jrtdd t|j|D }| j||| |fi |\}}}}}| D ]\}}||  |7  < q| D ]\}}||  |7  < q@| D ]\}}|| | qd| D ]\}}|| | q| D ]:\}} r|D ]}|| | qn|| | qq||d< |	|d< ||d< |	|d< |r,dd | D |d < |
|d < |rXd!d | D ||d" < |||d" < |r|d#d | D |d$< ||d$<  rd%d |D } | j ||t|d&d'| d(}!t |!d)|d*< | jrt t!d+krd,nd-}"t |	|"< t| D ],\}}|"d.r|#|||$d'd/< qd0|d1< |||fS )2Nc                    s   g | ]} r j |kr|qS r8   r   r   r   r8   r9   rM     rN   z'ViolinPlot.get_data.<locals>.<listcomp>Fr   r   r   r   g?r   r   r   )r   r   rE   r   r   r   r   r   rH   )r   r   r   r   r   rG   )r3   r4   c                 s   s   | ]}t tV  qd S rs   )r   rA   r   r8   r8   r9   ry   $  s   z&ViolinPlot.get_data.<locals>.<genexpr>r   c                 s   s   | ]\}}| |V  qd S rs   rt   rv   r8   r8   r9   ry   *  rN   Zmulti_line_1Z	patches_1c                 S   s.   i | ]&\}}|t |d  tr |nt|qS r   rl   rz   rk   r   rK   rx   r   r8   r8   r9   
<dictcomp>B  s   z'ViolinPlot.get_data.<locals>.<dictcomp>r   c                 S   s.   i | ]&\}}|t |d  tr |nt|qS r   r  r  r8   r8   r9   r	  F  s   r   c                 S   s.   i | ]&\}}|t |d  tr |nt|qS r   r  r  r8   r8   r9   r	  J  s   Z	scatter_1c                 S   s   g | ]}t |qS r8   r   )rK   r   r8   r8   r9   rM   O  rN   Zviolin_color_mapperr   )r   rf   r   )ZfieldZ	transformr   r`   r   ra   Zviolin_liner   r   Zviolin_line_width)%rl   r   r   r   r]   r   r   ro   rb   rd   r   r   opsr   rA   r   r   r   r   r3   r4   r   r   r   r%   rz   r{   r  r   Z_get_colormapperr   rc   r$   r#   
startswithr   replace)#rX   rY   rZ   re   r]   r   Z
split_namer   Zbar_mapZkde_mapr   Zscatter_mapr   r   r   ro   Zkde_dataZ	line_dataZseg_dataZbar_dataZscatter_datar   rr   r   r   r  Zsegsr  r   rx   r   r   r   Zcmapperrg   r8   r   r9   r     s    
,







zViolinPlot.get_data) r-   r.   r/   r1   r2   r3   ZNumericTupler   r4   ZObjectSelectorr   r@   r   r   r   r   r   rB   r   r   Z_draw_orderr    r!   r"   r   r   r   r7   r^   r   r  r   r8   r8   r8   r9   r   A  s:   
	
mr   )9Z
__future__r   r   r   collectionsr   	functoolsr   r1   Znumpyrk   Zbokeh.modelsr   r   r	   r
   Z	selectionr   corer   Zcore.dimensionr   r   Zcore.ndmappingr   Z	core.utilr   r   r   r   r   r   r   Zoperation.statsr   Zutil.transformr   Zchartr   rY   r   r   r   pathr   Zstylesr    r!   r"   utilr#   r$   r%   r&   r:   rC   r   r8   r8   r8   r9   <module>   s,   $ ~