o
    d|6                     @   s   d dl mZ d dlmZ d dlmZmZ d dlmZ e	dZ
e	dZe	dZe	dZd	d
d
d
dd d
d
fddZG dd deZd
S )    )absolute_import)OrderedDict)
exceptionsoptional_imports)
graph_objsnumpyscipyzscipy.cluster.hierarchyzscipy.spatialbottomNc                 C      t | dS Ncompleteschlinkagex r   f/var/www/html/visualizacion-main/env/lib/python3.10/site-packages/plotly/figure_factory/_dendrogram.py<lambda>       r   c           
   
   C   sj   t rtrts
td| j}t|dkrtd |du r tjj	}t
| |||||||d}	tj|	j|	jdS )a[	  
    Function that returns a dendrogram Plotly figure object. This is a thin
    wrapper around scipy.cluster.hierarchy.dendrogram.

    See also https://dash.plot.ly/dash-bio/clustergram.

    :param (ndarray) X: Matrix of observations as array of arrays
    :param (str) orientation: 'top', 'right', 'bottom', or 'left'
    :param (list) labels: List of axis category labels(observation labels)
    :param (list) colorscale: Optional colorscale for the dendrogram tree.
                              Requires 8 colors to be specified, the 7th of
                              which is ignored.  With scipy>=1.5.0, the 2nd, 3rd
                              and 6th are used twice as often as the others.
                              Given a shorter list, the missing values are
                              replaced with defaults and with a longer list the
                              extra values are ignored.
    :param (function) distfun: Function to compute the pairwise distance from
                               the observations
    :param (function) linkagefun: Function to compute the linkage matrix from
                               the pairwise distances
    :param (list[list]) hovertext: List of hovertext for constituent traces of dendrogram
                               clusters
    :param (double) color_threshold: Value at which the separation of clusters will be made

    Example 1: Simple bottom oriented dendrogram

    >>> from plotly.figure_factory import create_dendrogram

    >>> import numpy as np

    >>> X = np.random.rand(10,10)
    >>> fig = create_dendrogram(X)
    >>> fig.show()

    Example 2: Dendrogram to put on the left of the heatmap

    >>> from plotly.figure_factory import create_dendrogram

    >>> import numpy as np

    >>> X = np.random.rand(5,5)
    >>> names = ['Jack', 'Oxana', 'John', 'Chelsea', 'Mark']
    >>> dendro = create_dendrogram(X, orientation='right', labels=names)
    >>> dendro.update_layout({'width':700, 'height':500}) # doctest: +SKIP
    >>> dendro.show()

    Example 3: Dendrogram with Pandas

    >>> from plotly.figure_factory import create_dendrogram

    >>> import numpy as np
    >>> import pandas as pd

    >>> Index= ['A','B','C','D','E','F','G','H','I','J']
    >>> df = pd.DataFrame(abs(np.random.randn(10, 10)), index=Index)
    >>> fig = create_dendrogram(df, labels=Index)
    >>> fig.show()
    zmFigureFactory.create_dendrogram requires scipy,                             scipy.spatial and scipy.hierarchy   z X should be 2-dimensional array.N)distfun
linkagefun	hovertextcolor_threshold)datalayout)scpscsr   ImportErrorshapelenr   PlotlyErrordistancepdist_Dendrogramr   Figurer   r   )
Xorientationlabels
colorscaler   r   r   r   s
dendrogramr   r   r   create_dendrogram   s(   D
r-   c                   @   sX   e Zd ZdZdddejejddddd ddfdd	Zd
d Zdd Zdd Z	dd Z
dS )r%   z9Refer to FigureFactory.create_dendrogram() for docstring.r	   Nxaxisyaxisc                 C   r
   r   r   r   r   r   r   r   ~   r   z_Dendrogram.<lambda>c                 C   s  || _ || _|| _|| _g | _g | _| jd| jdi| _| ji | ji i| _| j dv r0d| j| j< nd| j| j< | j dv rBd| j| j< nd| j| j< |	d u rPtj	j
}	| |||	|
||\}}}}}|| _|| _| }| }g | _tt|D ]}|| dkr|| | jvr| j||  qvt| jt|d krtt| j}tt| j}t||d t|| t| }dd |D | _| j  | ||| _|| _d S )N   )leftr	   )rightr	   g        c                 S   s   g | ]}|qS r   r   ).0vr   r   r   
<listcomp>   s    z(_Dendrogram.__init__.<locals>.<listcomp>)r(   r)   r.   r/   r   leavessignr   r   r#   r$   get_dendrogram_tracesflatten	zero_valsranger!   appendintminmaxsortset_figure_layout)selfr'   r(   r)   r*   widthheightr.   r/   r   r   r   r   	dd_tracesxvalsyvalsordered_labelsr7   
yvals_flat
xvals_flatil_borderr_bordercorrect_leaves_posr   r   r   __init__s   sL   



z_Dendrogram.__init__c           
   	   C   s   ddddddddd	}t t| d
d d}|du r g d}n|}tt| D ]}t| | }|t|k r@|| ||< q*g d}|D ]\}}	z||	 ||< W qG ty`   d|t< Y qGw |S )z
        Returns colorscale used for dendrogram tree clusters.

        :param (list) colorscale: Colors to use for the plot in rgb format.
        :rtype (dict): A dict of default colors mapped to the user colorscale.

        redgreenbluecyanmagentayellowblackwhite)rgbcmykwc                 S   s   | d S )Nr   r   )tr   r   r   r      s    z,_Dendrogram.get_color_dict.<locals>.<lambda>)keyN)rgb(0,116,217)zrgb(35,205,205)zrgb(61,153,112)zrgb(40,35,35)zrgb(133,20,75)zrgb(255,65,54)zrgb(255,255,255)zrgb(255,220,0))
)C0r[   )C1rZ   )C2rY   )C3r\   )C4r]   )C5r^   )C6r_   )C7rZ   )C8rY   )C9r\   rc   )	r   sorteditemsr<   r!   keyslistKeyErrorn)
rC   r*   ddefault_colorsrgb_colorscalerL   r_   new_old_color_mapncocr   r   r   get_color_dict   s4   
	z_Dendrogram.get_color_dictc              	      s   ddddddddd}t jdkrFj}jd	v rj}|jvr'i j|<  fd
djD j| d< jj| d< dj| d< j  | j  S )z
        Sets and returns default axis object for dendrogram figure.

        :param (str) axis_key: E.g., 'xaxis', 'xaxis1', 'yaxis', yaxis1', etc.
        :rtype (dict): An axis_key dictionary with set parameters.

        linearoutsidealltickstozeroTF)typeticksmirror	rangemodeshowticklabelszerolineshowgridshowliner   )r1   r3   c                    s   g | ]	}|j    qS r   )r8   )r4   zvaxis_keyrC   r   r   r6     s    z/_Dendrogram.set_axis_layout.<locals>.<listcomp>tickvalsticktextarraytickmode)r!   r)   r.   r(   r/   r   r;   update)rC   r   axis_defaultsaxis_key_labelsr   r   r   set_axis_layout  s,   	



z_Dendrogram.set_axis_layoutc                 C   s6   | j ddd||d | | j | | j | j S )zP
        Sets and returns default layout object for dendrogram figure.

        Fclosest)
showlegendautosize	hovermoderD   rE   )r   r   r   r.   r/   )rC   rD   rE   r   r   r   rB   (  s   
z_Dendrogram.set_figure_layoutc              
   C   s  ||}||}t j|| j| jd|d}	t|	d }
t|	d }t|	d }t|	d }| |}g }tt|
D ]}| jdv rI|
| }n|| }| jdv rW|| }n|
| }|| }d}|rg|| }t	d	t
| j| j |t
| j| j |d
t	|| d|dd}z	t| jd }W n ty   d}Y nw z	t| jd }W n ty   d}Y nw d| |d< d| |d< || q=||
|||	d fS )ao  
        Calculates all the elements needed for plotting a dendrogram.

        :param (ndarray) X: Matrix of observations as array of arrays
        :param (list) colorscale: Color scale for dendrogram tree clusters
        :param (function) distfun: Function to compute the pairwise distance
                                   from the observations
        :param (function) linkagefun: Function to compute the linkage matrix
                                      from the pairwise distances
        :param (list) hovertext: List of hovertext for constituent traces of dendrogram
        :rtype (tuple): Contains all the traces in the following order:
            (a) trace_list: List of Plotly trace objects for dendrogram tree
            (b) icoord: All X points of the dendrogram tree as array of arrays
                with length 4
            (c) dcoord: All Y points of the dendrogram tree as array of arrays
                with length 4
            (d) ordered_labels: leaf labels in the order they are going to
                appear on the plot
            (e) P['leaves']: left-to-right traversal of the leaves

        T)r(   r)   no_plotr   icoorddcoordivl
color_list)topr	   Nscatterlines)colortext)r   r   r^   modemarkerr   	hoverinfor2    r   r.   r^   r/   r7   )r   r,   r(   r)   r   r   rz   r<   r!   dictnpmultiplyr8   r.   r/   r>   
ValueErrorr=   )rC   r'   r*   r   r   r   r   rt   ZPr   r   rI   r   colors
trace_listrL   xsys	color_keyhovertext_labeltracex_indexy_indexr   r   r   r9   <  sb   





z!_Dendrogram.get_dendrogram_traces)__name__
__module____qualname____doc__r   infrP   rz   r   rB   r9   r   r   r   r   r%   p   s$    
EM#r%   )
__future__r   collectionsr   plotlyr   r   plotly.graph_objsr   
get_moduler   r   r   r   r-   objectr%   r   r   r   r   <module>   s"   




_