
    g76                         d dl mZ d dlmZmZ d dlmZ  ej                  d      Z ej                  d      Z	 ej                  d      Z
 ej                  d      Zdd	d	d	d
 d	d	fdZ G d de      Zy	)    )OrderedDict)
exceptionsoptional_imports)
graph_objsnumpyscipyzscipy.cluster.hierarchyzscipy.spatialbottomNc                 .    t         j                  | d      S Ncompleteschlinkagexs    ^/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/plotly/figure_factory/_dendrogram.py<lambda>r      s    Q
3     c           
      N   t         rt        rt        st        d      | j                  }t        |      dk7  rt        j                  d       |t        j                  j                  }t        | |||||||      }	t        j                  |	j                  |	j                        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.)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
dendrograms
             r   create_dendrogramr-      s    H c?
 	

 	
A
1v{AB,,$$	'	J *//*:K:KLLr   c                   p    e Zd ZdZdddej
                  ej
                  dddd ddfdZd Zd	 Zd
 Z	d Z
y)r%   z9Refer to FigureFactory.create_dendrogram() for docstring.r	   Nxaxisyaxisc                 .    t         j                  | d      S r   r   r   s    r   r   z_Dendrogram.<lambda>z   s    S[[J7 r   c           
      
   || _         || _        || _        || _        g | _        g | _        | j                  d| j                  di| _        | j                  i | j                  i i| _        | j                   dv rd| j                  | j                  <   nd| j                  | j                  <   | j                   dv rd| j                  | j                  <   nd| j                  | j                  <   |	t        j                  j                  }	| j                  |||	|
||      \  }}}}}|| _        || _        |j                         }|j                         }g | _        t        t        |            D ];  }||   dk(  s||   | j                  vs| j                  j!                  ||          = t        | j                        t        |      dz   kD  ryt#        t%        | j                              }t#        t'        | j                              }t        ||dz   t#        ||z
  t        |      z              }|D cg c]  }| c}| _        | j                  j)                          | j+                  ||      | _        || _        y c c}w )N   )leftr	   )rightr	   g        )r(   r)   r/   r0   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/   r0   r   r   r   r   	dd_tracesxvalsyvalsordered_labelsr7   
yvals_flat
xvals_flatil_borderr_bordercorrect_leaves_posvs                            r   __init__z_Dendrogram.__init__o   s'    '

	ZZDJJ2	zz2tzz2611$%DIIdjj!$&DIIdjj!22$%DIIdjj!$&DIIdjj!?ll((G<@<V<Vz7J	?=
9E5.& %]]_
]]_
s:' 	5A!}#
1T^^(K%%jm4	5 t~~Ua/
 3t~~./H3t~~./H!&(Q,X-@CJ,N(O" *<<Aa<DN,,UF;		 =s   6	J c           	         ddddddddd	}t        t        |j                         d
             }|g d}n|}t        t	        |j                                     D ]5  }t        |j                               |   }|t	        |      k  s.||   ||<   7 g d}|D ]  \  }}		 ||	   ||<    |S # t        $ r d|t        <   Y 'w xY w)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                     | d   S )Nr    )ts    r   r   z,_Dendrogram.get_color_dict.<locals>.<lambda>   s
    QqT r   )key)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]   )C1r\   )C2r[   )C3r^   )C4r_   )C5r`   )C6ra   )C7r\   )C8r[   )C9r^   rg   )	r   sorteditemsr<   r!   keyslistKeyErrorn)
rC   r*   ddefault_colorsrgb_colorscalerL   ra   new_old_color_mapncocs
             r   get_color_dictz_Dendrogram.get_color_dict   s      
 %VAGGI>%JK	N (Ns>..012 	6A^((*+A.A3~&&$21$5q!	6
 ( 	5FB5%3B%7r"	5   5 %5q!	5s   !B--CCc           	         ddddddddd}t        | j                        dk7  r| j                  }| j                  d	v r| j                  }|| j
                  vri | j
                  |<   | j                  D cg c]  }|| j                  |   z   c}| j
                  |   d
<   | j                  | j
                  |   d<   d| j
                  |   d<   | j
                  |   j                  |       | j
                  |   S c c}w )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   )r4   r6   tickvalsticktextarraytickmode)	r!   r)   r/   r(   r0   r   r;   r8   update)rC   axis_keyaxis_defaultsaxis_key_labelszvs        r   set_axis_layoutz_Dendrogram.set_axis_layout  s      !"	
 t{{q "jjO#44"&**dkk1/1O,37>>8-/TYYx((8DKK(4 8<{{DKK(47>DKK(4H$$]3{{8$$8s   5C<c                     | j                   j                  ddd||d       | j                  | j                         | j                  | j                         | j                   S )zP
        Sets and returns default layout object for dendrogram figure.

        Fclosest)
showlegendautosize	hovermoderD   rE   )r   r   r   r/   r0   )rC   rD   rE   s      r   rB   z_Dendrogram.set_figure_layout$  sZ    
 	#!& 	
 	TZZ(TZZ({{r   c                     ||      } ||      }t         j                  || j                  | j                  d|      }	t        j                  |	d         }
t        j                  |	d         }t        j                  |	d         }t        j                  |	d         }| j                  |      }g }t        t        |
            D ]  }| j                  dv r|
|   }n||   }| j                  dv r||   }n|
|   }||   }d}|r||   }t        d	t        j                  | j                  | j                     |      t        j                  | j                  | j                     |      d
t        ||         |d      }	 t        | j                  d         }	 t        | j                  d         }d| |d<   d| |d<   |j!                  |        ||
|||	d   fS # t        $ r d}Y Tw xY w# t        $ r d}Y Lw xY w)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   	hoverinfor5    r   r/   r`   r0   r7   )r   r,   r(   r)   npr   r~   r<   r!   dictmultiplyr8   r/   r0   r>   
ValueErrorr=   )rC   r'   r*   r   r   r   r   rx   ZPr   r   rI   r   colors
trace_listrL   xsys	color_keyhovertext_labeltracex_indexy_indexs                           r   r9   z!_Dendrogram.get_dendrogram_traces8  s   0 AJqMNN((;;+  
 !H+&!H+&!E(+XXao.
$$Z0
s6{# '	%A #44AYAY#44AYAY"1I"O"+A,++dii

3R8++dii

3R8&"34$ Edjjn-djjn-  !	]E'N 	]E'Ne$O'	%R 66>1X;FF  
  s$    GG0G-,G-0G>=G>)__name__
__module____qualname____doc__r   infrQ   r~   r   rB   r9   rd   r   r   r%   r%   l   sP    C
 ffvv7CJKZ!%F(SGr   r%   )collectionsr   plotlyr   r   plotly.graph_objsr   
get_moduler   r   r   r   r-   objectr%   rd   r   r   <module>r      s    # / ( !  )!!!'*!!!";<!!!/2
 3\M~_G& _Gr   