a
    bbel                     @   s,  d Z ddlZddlmZmZ ddlm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ZmZ dd
lmZmZmZ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! ddl"m#Z#m$Z$ ddl%m&Z& G dd deZ'G dd deZ(dd Z)dd Z*dd Z+dd Z,ej-.e, ej-.e+ dS )zv
HoloViews integration for Panel including a Pane to render HoloViews
objects and their widgets and support for Links
    N)OrderedDictdefaultdict)Version)partial)SpacerRange1d)Theme   )stateunlocked)Column	WidgetBoxHSpacerVSpacerRow)
LayoutableViewable)Player   )PaneBasePaneRerenderError)Bokeh
Matplotlib)Plotlyc                
       s  e Zd ZdZejdg dd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dZejdg dddZejeeegd	eddZejdddgddZeji ddZdZeeedZdddddddddd	ZddgZd< fdd	Zej ddd	d d!d" Z!ej d#d	d d$d% Z"ej d&d'd	d d(d) Z#d*d+ Z$d,d- Z%d=d.d/Z&d0d1 Z'd2d3 Z( fd4d5Z)e*d6d7 Z+d>d8d9Z,e-j,je,_e*d?d:d;Z.  Z/S )@	HoloViewsap  
    `HoloViews` panes render any `HoloViews` object using the
    currently selected backend ('bokeh' (default), 'matplotlib' or 'plotly').

    To be able to use the `plotly` backend you must add `plotly` to
    `pn.extension`.
    
    Reference: https://panel.holoviz.org/reference/panes/HoloViews.html

    :Example:

    >>> HoloViews(some_holoviews_object)
    N)bokehplotly
matplotlibzu
        The HoloViews backend used to render the plot (if None defaults
        to the currently selected renderer).)defaultobjectsdocFz$
        Whether to center the plot.)r   r!   Tz`
        Whether to link the axes of bokeh plots inside this pane
        across a panel layout.zk
        Explicit renderer instance to use for rendering the HoloViews
        plot. Overrides the backend.z4
        Bokeh theme to apply to the HoloViews plot.)r   Zclass_Z
allow_Noner!   	right_top)leftbottomrighttoptop_left	top_rightbottom_leftbottom_rightleft_topleft_bottomr"   right_bottomz~
        The layout of the plot and the widgets. The value refers to the
        position of the widgets relative to the plot.z5
        The layout object to display the widgets in.)r    Zconstantr   r!   
individualscrubberzb)
        Whether to generate individual widgets for each dimension or
        on global scrubber.zw
        A mapping from dimension name to a widget instance which will
        be used to override the default widgets.皙?)r   r   r   )	backendcenterlinked_axesrendererthemewidgetswidget_layoutwidget_locationwidget_typeobjectr1   c                    s`   t  j|fi | d| _d| _d | _|  | _g | _|   i | _	| j
| j| j d| _d S )NFT)super__init___initialized_responsive_content_restore_plotr7   
widget_box_widget_container_update_widgets_plotsparamwatch_rerender_paramsselfr:   params	__class__ 3lib/python3.9/site-packages/panel/pane/holoviews.pyr<   ]   s    
zHoloViews.__init__r2   r8   )rE   c                 C   s  | j }t| jsg }n|dv r2tt | jt }nz|dv rNtt | jt }n^|dv rft| jt }nF|dv r~tt | j}n.|dv rt| jt }n|dv rtt | j}| jo| j }|| _	|s|rt | t g}n| g}n|r~|
dr|t | t g}nx|
dr"t | t |g}nZ|
d	rPt t|tt | t t g}n,|
d
rt ttt | t |t g}n^|
dr|| g}nH|
dr| |g}n2|
d	rt|| g}n|
d
rt| |g}|| jd d < d S )N)r#   r%   )r&   r$   )r'   r)   )r(   r*   )r+   r"   )r,   r-   r#   r%   r&   r$   )r8   lenr@   r   r   r   r   r2   r>   rA   
startswithlayout)rH   Zlocr6   r2   Z
componentsrL   rL   rM   _update_layouti   sN    
""

zHoloViews._update_layoutr5   c                 G   s6   | j d u rd S | j D ]\}}|jr| j |j_ qd S N)r5   _modelsvaluesdocument)rH   eventsmodel_rL   rL   rM   _update_theme   s
    
zHoloViews._update_themer9   r6   c                 G   s   | j d u rg g  }}n| | j | j| j\}}|| _t| jD ],}|j| jj	v r>|jj
| | j| q>|D ] }|j
| jd}| j| qp|| jd d < |r| j| jvs|s| j| jv s| js|   d S )Nvalue)r:   widgets_from_dimensionsr6   r9   _valueslist
_callbacksinstr@   r    rD   ZunwatchremoverE   _widget_callbackappendrA   r=   rQ   )rH   rV   r6   rT   cbwidgetZwatcherrL   rL   rM   rB      s,    

zHoloViews._update_widgetsc                    sl  ddl m}m} | jj}|s d S | jdkrL|dd | j D |d j nPt	dd |D  |j
rdd |D  fd	d|jD  |t	 |j|j |jd
kr8|jst|jrt  |  W d    n1 s0    Y  |jr6d|jjvr6|  n*|jjr,|jt|j  n
|  n0|  t|jdr`|j||_n|j|_d S )Nr   )cross_indexwrap_tuple_streamsr/   c                 S   s   g | ]}|qS rL   rL   .0vrL   rL   rM   
<listcomp>       z*HoloViews._update_plot.<locals>.<listcomp>c                 s   s   | ]}|j V  qd S rR   )rZ   rh   wrL   rL   rM   	<genexpr>   rk   z)HoloViews._update_plot.<locals>.<genexpr>c                 S   s   g | ]
}|j qS rL   namerl   rL   rL   rM   rj      rk   c                    s&   g | ]}|v r  | nd qS rR   )index)rh   ZkdimkeyZwidget_dimsrL   rM   rj      s   r   Zembeddedget_plot_state)holoviews.core.utilre   rf   r@   r    r9   r\   rT   rZ   tupledynamicZ
dimensionsZstreamsr1   commr
   Z
_unblockedrU   r   updateroottagspushZsession_contextZadd_next_tick_callbackr   hasattrr4   rt   r:   )rH   plotpanere   rf   r6   rL   rr   rM   _update_plot   s4    
"(


zHoloViews._update_plotc                 C   s(   | j  D ]\}\}}| || q
d S rR   )rC   itemsr   )rH   ZeventrX   r~   r   rL   rL   rM   ra      s    zHoloViews._widget_callbackc                 C   s  ddl m} |d u r | ||S |jd }| jd u rLt }||f| j|< |S | jd urd| j}d | _n"t| j|rx| j}n| 	|||}| |_
|jj}	t|jdr|j|}
n|j}
|	dkr| jr|
jdvr| jsd| _|   || _t nd| _d	d
 | j  D }| j|	|
fi |}| || |||||}|| jv rd| j| \}}d |_|  ||f| j|< ||f| j|< |S )Nr   Plotidrt   r   )ZfixedNTFc                 S   s(   i | ] \}}|t jv r|d kr||qS ro   )r   rD   )rh   pri   rL   rL   rM   
<dictcomp>  s   z(HoloViews._get_model.<locals>.<dictcomp>)holoviews.plotting.plotr   get_rootrefr:   	_BkSpacerrS   r?   
isinstance_renderr   r4   r1   r}   rt   r
   r2   Zsizing_moder>   rQ   r   rD   rT   r   	_get_paner   
_get_modelrC   rx   cleanup)rH   r!   rz   parentrx   r   r   rW   r~   r1   r
   kwargsZ
child_paneold_plotold_panerL   rL   rM   r      sP    


zHoloViews._get_modelc                 K   s:   | j |t}t|tr*t|tr*d|d< ||fi |S )NTZtight)_panesgetr   r   type
issubclassr   )rH   r1   r
   r   Z	pane_typerL   rL   rM   r     s    zHoloViews._get_panec                 C   s:  dd l }ddl m}m} | jr,| j}|j}n4|jsJ| jp:d}	||	 |	|_| jpT|j}|j| }|d u rldnd}
|dkri }| jd ur| j|d< n$|jrt|jddi ikr|j|d< |
|jkr|
|d	< |r|j	f i |}d
| j
i}|dkstt|jtdkr&||d< ||d< |r&||d< |j| jfi |S )Nr   )Storer4   r   Zserverr   r5   Z_jsonattrsmodemarginz1.13.0r!   rz   rx   )	holoviewsr   r4   r1   Z	renderersZcurrent_backendr5   getattrr   instancer   r   str__version__Zget_plotr:   )rH   r!   rx   rz   Zhvr   Zload_rendererr4   r1   Zloaded_backendr   rI   r   rL   rL   rM   r      s:    





"zHoloViews._renderc                    sB   | j |jd d\}}|r$|  |r2|| t | dS )zr
        Traverses HoloViews object to find and clean up any streams
        connected to existing plots.
        r   NNN)rC   popr   r   _cleanupr;   )rH   rz   r   r   rJ   rL   rM   r   C  s    
zHoloViews._cleanupc                 C   s:   dt jvrdS ddlm} ddlm} t||p8t||S )Nr   Fr   )Dimensionedr   )sysmodulesZholoviews.core.dimensionr   r   r   r   )clsobjr   r   rL   rL   rM   appliesS  s
    
zHoloViews.appliesc                 K   sN   |r|rt dn|s"|s"t d|d u r.i }ddlm} || |||||dS )Nz^Either supply a set of properties to link as keywords or a set of JS code callbacks, not both.zFDeclare parameters to link or a set of callbacks, neither was defined.r	   Link)Z
propertiescodeargsbidirectional)
ValueErrorlinksr   )rH   targetr   r   r   r   r   rL   rL   rM   jslink[  s    
zHoloViews.jslinkc           '   	      s  ddl m}m} ddlm} ddlmm m} ddl	m
} ddlm}	m}
 ddlm} dd	lm}m}m}m}m}m} |d u ri }t||
r|j}nt||	r|j}t||r|jrd
dd |jD }d}||j|d||\}}||\}}||dgkr|dgks(|s0t|dkr0g i fS d}|r@t ntt|t| t  }g }fdd|D }t!|D ]:\}d d i   }}}|dkr|dkr|t|d krd}n,|dkrd}n|t|d krd}nd}|dd}ni }j"p
#d } | d ur"t$|| } | |j%< |dkrR| sDt&d|t| 9 }nj%|v r|j% }t||r|j'j(f i | |j%sj)|_%|*| qvnPt|tr|#d|}t|}n.t|t+rt,||r|}nt&d|f |(| | rt- fdd| D rbt| dkrbt.| } fd d| D }!t t|!| }"|p^|}nt$| }"|pr|}j/d u r| d nj/}#ttj)|"|#d!fi |}|f i |}nj0d"krj0\}$}%|$|%krސqvj/d u r|$nj/}#|d ur nbt-d#d |$|%|#fD r6|}j1d u r.dnj1}&n,t|# rH|}n|}j1d u r\d$nj1}&tt|&j)j0d j0d |#d%fi |}|f i |}|d urv|*| qv|dkrt2|d&d'g}||fS )(Nr   )	Dimension
DynamicMap)SkipRendering)	isnumericdatetime_typesunique_iterator)unique_dimkeys)r   GenericCompositePlot)get_dynamic_moder	   )WidgetDiscreteSliderSelectFloatSliderDatetimeInput	IntSliderz, c                 s   s   | ]}d | V  qdS )z%rNrL   )rh   dimrL   rL   rM   rn     rk   z4HoloViews.widgets_from_dimensions.<locals>.<genexpr>zDynamicMap cannot be displayed without explicit indexing as {dims} dimension(s) are unbounded. 
Set dimensions bounds with the DynamicMap redim.range or redim.values methods.)dimsZFrame)r   r   c                    s.   g | ]&}  |d us&|js&|jdkr|qS )Nr   )r   rT   range)rh   d)rT   rL   rM   rj     s   z5HoloViews.widgets_from_dimensions.<locals>.<listcomp>r.   )   r   r   r   )r   r      r   )r   r   r   r   )r   r   r   r      )r   widthr/   zAScrubber widget may only be used if all dimensions define values.r   ziExplicit widget definitions expected to be a widget instance or type, %s dimension widget declared as %s.c                 3   s    | ]}|pt | V  qd S rR   )r   rg   )r   r   rL   rM   rn     rk   c                    s   g | ]}t  |qS rL   )r   Zpprint_valuerg   )r   rL   rM   rj     rk   )rp   optionsrZ   r   c                 s   s   | ]}t |tV  qd S rR   )r   intrg   rL   rL   rM   rn     rk   g?)steprp   startendrZ   i&  )Zlengthr   )3Zholoviews.corer   r   holoviews.core.optionsr   ru   r   r   r   Zholoviews.core.traversalr   r   r   r   Zholoviews.plotting.utilr   r6   r   r   r   r   r   r   r   rP   ZhmapZ	unboundedjoinformatrN   dictzipr   	enumeraterT   r   r]   rp   r   rD   ry   Zlabelrb   r   r   allsortedr   r   r   r   )'r   r:   Zwidget_typesZwidgets_typer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   msgrw   ZboundedkeysZnframesZ
dim_valuesr6   ir9   rd   Zwidget_kwargsr   r   Zvalslabelsr   r   r   r   r   rL   )r   r   r   rT   rM   r[   l  s     











(






z!HoloViews.widgets_from_dimensions)N)NNN)NNF)Nr.   )0__name__
__module____qualname____doc__rD   ZObjectSelectorr1   ZBooleanr2   r3   Z	Parameterr4   ZClassSelectorr   r   r5   r8   r   r   r   r7   r9   Dictr6   priorityr   r   r   r   Z_renamerF   r<   dependsrQ   rY   rB   r   ra   r   r   r   r   classmethodr   r   r   r[   __classcell__rL   rL   rJ   rM   r      s^   

1

#
2#


r   c                       s^   e Zd ZdZd fdd	Zedd Zeddd Z	d	d
 Z
dddZ fddZ  ZS )InteractiveNc                    s6   t  j|fi | |   | j| jttj d S rR   )r;   r<   rQ   rD   rE   _update_layout_propertiesr]   r   rG   rJ   rL   rM   r<     s    zInteractive.__init__c                 C   s,   dt jvrdS ddlm} t||r(dS dS )Nzhvplot.interactiveFr   )r   r0   )r   r   Zhvplot.interactiver   r   )r   r:   r   rL   rL   rM   r     s    
zInteractive.appliesr:   c                    sF    j d u rd  _n0 j   _ jjjf i  fddtjD  d S )Nc                    s    i | ]}|d kr|t  |qS ro   r   rh   r   rH   rL   rM   r     s   z.Interactive._update_layout.<locals>.<dictcomp>)r:   _layout_panelrP   rD   ry   r   r   rL   r   rM   rQ     s    
zInteractive._update_layoutc                 G   s0   | j d u rd S | j jjf i dd |D  d S )Nc                 S   s   i | ]}|j |jqS rL   )rp   new)rh   erL   rL   rM   r     rk   z9Interactive._update_layout_properties.<locals>.<dictcomp>)r   rD   ry   )rH   rV   rL   rL   rM   r     s    
z%Interactive._update_layout_propertiesc                    sh   |d u r  ||S  jd u r>tf i  fddtjD }n j||||}||f j|jd < |S )Nc                    s    i | ]}|d kr|t  |qS ro   r   r   r   rL   rM   r     s   z*Interactive._get_model.<locals>.<dictcomp>r   )r   r   r   r   rD   r   rS   r   )rH   r!   rz   r   rx   rW   rL   r   rM   r     s    
zInteractive._get_modelc                    s&   | j d ur| j | t | d S rR   )r   r   r;   )rH   rz   rJ   rL   rM   r     s    
zInteractive._cleanup)N)NNN)r   r   r   r   r<   r   r   rD   r   rQ   r   r   r   r   rL   rL   rJ   rM   r     s   

	
r   c                 C   sD   ddl m}m}m} t| |s"dS | jjdkoBt| |oBt| | S )zj
    Checks whether plotting instance is a HoloViews ElementPlot rendered
    with the bokeh backend.
    r   )GenericElementPlotGenericOverlayPlotr   Fr   )r   r   r   r   r   r4   r1   )r~   r   r   r   rL   rL   rM   is_bokeh_element_plot  s    

r   c           	      C   s   t t}| jd }|D ]f}| jd |jv r|j|d\}}|du rFq|dd tg}|D ]}|jD ]}|| 	| qfq\q|S )z4
    mapping panel elements to its bokeh models
    r   r   Nc                 S   s   | S rR   rL   xrL   rL   rM   <lambda>-  rk   z*generate_panel_bokeh_map.<locals>.<lambda>)
r   r]   r   rS   rC   r   traverser   Zlink_sourcesrb   )	
root_modelZpanel_viewsZ
map_hve_bkr   r   r~   ZsubpaneZbk_plotsZhv_elemrL   rL   rM   generate_panel_bokeh_map"  s    

r   c                    s  |  t}fdd|D }t|dks,dS zddlm} ddlm  W n ty\   Y dS 0 dd |D } fd	d|D }d
d |D }g }|D ]r\\}	}
|
D ]`jdu r|	|	df q fdd|D }dd |D }|r|	|	|d d f qqt
|| j }g }|D ]X\}}|jd t }|du stddr`|du r`q|	||| q| j| |S )zd
    Traverses the supplied Viewable searching for Links between any
    HoloViews based panes.
    c                    s4   g | ],}|j  D ]\}}t|d d u r|qqS )rz   N)rC   rT   r   )rh   Zviewr~   rX   )r   rL   rM   rj   :  s   zfind_links.<locals>.<listcomp>r   Nr   r   LinkCallbackc                 S   s,   g | ]$}| d d tgD ]}||fqqS )c                 S   s   | S rR   rL   r   rL   rL   rM   r   G  rk   z'find_links.<locals>.<listcomp>.<lambda>)r   r   )rh   	root_plotr~   rL   rL   rM   rj   F  s   c                    s   g | ]\}}  ||fqS rL   Z	find_link)rh   r~   r   r   rL   rM   rj   I  s   c                 S   s   g | ]}|d  dur|qS )r   NrL   r   rL   rL   rM   rj   K  rk   c                    s$   g | ]\}}|ur  |qS rL   r   )rh   r~   Z
inner_root)r   linkr   rL   rM   rj   S  s   c                 S   s   g | ]}|d ur|qS rR   rL   r   rL   rL   rM   rj   U  rk   r   Z_requires_targetF)selectr   rN   Zholoviews.plotting.linksr   Z"holoviews.plotting.bokeh.callbacksr   	Exceptionr   rb   setZ_found_linksr^   r   r   ry   )	root_viewr   Zhv_viewsZ
root_plotsr   plotsZ
potentialsZsource_linksfoundr~   r   Z	tgt_linksZ	new_found	callbacksZsrc_plotZtgt_plotrc   rL   )r   r   r   r   rM   
find_links4  sF    


r  c                    sr  |  t}|sdS ddlm} ddlm}m} ddlm} |j	d }t
t}|D ]
}	||	jvrbqP|	j| d }
|	jrP|
jjdksPt|
dd	sqP|
j|gd
D ]}|jdu rq|d|jdjd}|jr|rq|j}|jjrtdd |jjd D }|| |||jd |jf |jjrtdd |jjd D }|| |||jd |jf qqP| D ]\}}|d \}}}}t |t!r|dd |D \}}|j"|j#kr|| }}||_"||_#|dd D ]\}}}}g }t$|t$|urq||jjv rR||jurRt%|dr8t||j&|jj& |_&||_||j'd< |d ||jjv r||jurt%|drt||j&|jj& |_&||_||j'd< |d t|d}|r|( }n|g}|D ]}|j)D ]}|j* t%|dr |j+7  t, fdd|D sqd|v r.|j'd |j'd< d|v rH|j'd |j'd< |-  |j.|j/d qؐqΐqҐqfdS )zU
    Pre-processing hook to allow linking axes across HoloViews bokeh
    plots.
    Nr   )r   )r   	max_range)ElementPlotr   r   shared_axesF)ZspecsZnormaxiswisec                 s   s$   | ]}t |trt|n|V  qd S rR   r   r]   rv   rh   trL   rL   rM   rn     rk   zlink_axes.<locals>.<genexpr>c                 s   s$   | ]}t |trt|n|V  qd S rR   r  r  rL   rL   rM   rn     rk   c                 S   s.   g | ]&}t |d  tr|d  j|d  jfqS ))r   r   r   r   )rh   axrL   rL   rM   rj     s   zlink_axes.<locals>.<listcomp>r   factorsx_rangey_rangesubplotsextra_modelsc                 3   s   | ]}| v V  qd S rR   rL   )rh   cmodelsrL   rM   rn     rk   )Zplot_id)0r   r   r   r   ru   r   r  Z holoviews.plotting.bokeh.elementr  r   r   r]   rC   r3   r4   r1   r   r   Zcurrent_frameZlookup_optionsr   r   r  r
   r  r{   rv   rb   Zxaxisr  Zyaxisr   r   r   r   r   r   r}   r  ZhandlesrT   r   r  r  anyresetZ
initializer   )r   r   Zpanesr   r   r  r  r   Z	range_mapr   r~   r   r  ZfigtagZaxesr
  Zaxisr   r   ZpaxrX   Zchangedr  r   ZspcallbackrL   r  rM   	link_axese  s    







"










r  )/r   r   collectionsr   r   Zpackaging.versionr   	functoolsr   rD   Zbokeh.modelsr   r   r   Zbokeh.themes.themer   ior
   r   rP   r   r   r   r   r   Zviewabler   r   r6   r   baser   r   r   r~   r   r   r   r   r   r   r   r   r  r  Z_preprocessing_hooksrb   rL   rL   rL   rM   <module>   s2      O11Z