U
    Åmœd½—  ã                #   @   s.  d dl 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
mZmZmZmZ d dlZd dlZd dlZd dlm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% d dl&m'Z'm&Z& ddl(m)Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl(m1Z1 ee2ee3df f Z4e.d Z5e.d Z6e.d Z7ee2e3ee
e3 ge3f f Z8G dd„ deej9ƒZ:d¢dd„Z;dd„ Z<d£ej=ee
e2 e'df ee d$œd%d&„Z>d¤ej=ee2 d'œd(d)„Z?d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLœ"Z@d¥dMdN„ZAd¦e2eeB eeC e2eeBe2df dOœdPdQ„ZDd§ee
e2 e'df e'dRœdSdT„ZEdUdV„ ZFee2e
e2 e'f dWœdXdY„ZGdZd[„ ZHd¨d]d^„ZId©d_d`„ZJdªdadb„ZKd«dedf„ZLd¬eee
e f e.di djœdkdl„ZMd­ej=e.di eee	e f dpœdqdr„ZNeej=dsœdtdu„ZOd®eej=e
eC dvœdwdx„ZPdydz„ ZQd{d|„ ZRd}d~„ ZSd¯d€d�„ZTd‚dƒ„ ZUd°d…d†„ZVee!d‡œdˆd‰„ZWee3dŠœd‹dŒ„ZXeej=d�œdŽd�„ZYeej=d�œd‘d’„ZZd“d”„ Z[d±d–d—„Z\d²eeeCeCf e:f eCeCee3 ee3 ee
e3  ee
e3  ee!ej]f d˜œd™dš„Z^d›dœ„ Z_ej`e2d�œdždŸ„Zad³d d¡„ZbdS )´é    N)ÚABC)Ú	lru_cache)ÚUnionÚListÚSequenceÚTupleÚ
CollectionÚOptionalÚCallable)Úpyplot)ÚrcParamsÚtickerÚgridspecÚaxes)ÚAxes)Úis_color_like)ÚSubplotParamsÚFigure©ÚCircle)ÚPatchCollection)ÚCyclerÚcycleré   )Úlogging)Úsettings)ÚLiteral)ÚNeighborsViewé   )Úpalettes.)ÚfaÚfrÚrtZrt_circularZdrlZeq_tree.)ZlightÚnormalÚmediumZsemiboldÚboldZheavyÚblack)zxx-smallzx-smallZsmallr$   Zlargezx-largezxx-largec                   @   s   e Zd ZdZdS )Ú_AxesSubplotz>Intersection between Axes and SubplotBase: Has methods of bothN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r,   r,   úO/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scanpy/plotting/_utils.pyr'   #   s   r'   ç      à?c                 C   s²   |
dkrt  ¡ }
|
j| |d�}|dk	r0|
 |¡ |dk	rB|
 |¡ |dk	rT|
 |¡ |dk	rt|
jtt|ƒƒ|dd� |dk	r�|
 	tt|ƒƒ|¡ t j
|||
d� td||	d� dS )zPlot a matrix.N)ÚcmapÚvertical)Zrotation)ÚshrinkÚaxÚmatrix)ÚshowÚsave)ÚplZgcaÚimshowÚ
set_xlabelÚ
set_ylabelÚ	set_titleÚ
set_xticksÚrangeÚlenÚ
set_yticksÚcolorbarÚsavefig_or_show)r3   ÚxlabelÚylabelZxticksÚyticksÚtitleZcolorbar_shrinkÚ	color_mapr4   r5   r2   Úimgr,   r,   r-   r3   ,   s&    


  ÿr3   c                 K   s:   t jtdd„ td D ƒƒtdddd�d� t| f|Ž d	S )
zPlot X. See timeseries_subplot.c                 s   s   | ]}d | V  qdS )r   Nr,   )Ú.0Úsr,   r,   r-   Ú	<genexpr>P   s     ztimeseries.<locals>.<genexpr>úfigure.figsizeg¸…ëQ¸¾?g\�Âõ(\ï?g¤p=
×£À?©ÚleftÚrightÚbottom©ÚfigsizeZsubplotparsN)r6   ÚfigureÚtupler   ÚspparsÚtimeseries_subplot)ÚXÚkwargsr,   r,   r-   Ú
timeseriesM   s
    þrW   r,   Ú úgene expressionTÚviridis)rU   Úpaletter2   c                    s  ˆdk	rt ˆd ttjfƒ}t|
ƒ}
|dkr<t ˆ jd ¡n|‰ˆ jdkrZˆ dd…df ‰ ˆ jd dkr¢|
dˆ jd …  ¡ d }‡ ‡fdd„t	ˆ jd ƒD ƒ}nh|rÄˆg}ˆˆ dd…df fg}nFtj
ˆdd�\}}t |
dt|ƒ…  ¡ d ¡}‡ ‡‡fd	d„|D ƒ}|dk�rt ¡ }t|ƒD ]J\}\}}|j||d
dtd || t|ƒdk�r^|| nd|tjd�	 �q$| ¡ }|D ](}|j||g|d |d gddd� �q|| |¡ |dk	�rÄ| |¡ | |¡ | |¡ |dk	�rì| |¡ t|ƒdk�r|	�r|jdd� dS )zØ    Plot X.

    Parameters
    ----------
    X
        Call this with:
        X with one column, color categorical.
        X with one column, color continuous.
        X with n columns, color is of length n.
    Nr   r   Úcolorc                    s    g | ]}ˆˆ d d …|f f‘qS ©Nr,   ©rG   Úi)rU   Úx_ranger,   r-   Ú
<listcomp>y   s     z&timeseries_subplot.<locals>.<listcomp>T)Zreturn_inversec                    s,   g | ]$}ˆˆ|k ˆ ˆ|kd d …f f‘qS r]   r,   )rG   Úlevel©rU   r\   r`   r,   r-   ra   €   s     Ú.Úfacezlines.markersizerX   )ÚmarkerZ	edgecolorrH   ÚcÚlabelr/   Ú
rasterizedú--r&   ©r\   F)Zframeon)Ú
isinstanceÚfloatÚnpZfloatingÚdefault_paletteÚarangeÚshapeÚndimÚby_keyr<   ÚuniqueÚarrayr=   r6   ZsubplotÚ	enumerateÚscatterr   r   Ú_vector_friendlyÚget_ylimÚplotÚset_ylimÚset_xlimr8   r9   r>   Úlegend)rU   Útimer\   Ú	var_namesÚhighlights_xrA   rB   rC   Úxlimr}   r[   rE   r2   Zuse_color_mapÚcolorsZsubsetsÚlevelsÚ_r_   ÚxÚyÚylimÚhr,   rc   r-   rT   V   sR    
 
÷
&






rT   )rU   r   c           	      C   sö   t |ƒdkrt | jd ¡}|jdkr6|dd…df }| j} t | ¡}tj	dd�\}}|j
tj| tjd�dd	|d
�}tj|dd� t t| jd ƒ|¡ |D ]$}tj||gd| jd gddd� qœt d| jd d g¡ t d| jd d g¡ dS )z­    Plot timeseries as heatmap.

    Parameters
    ----------
    X
        Data array.
    var_names
        Array of strings naming variables stored in columns of X.
    r   r   r   N)g      @é   ©rP   )ÚdtypeÚautoZnearest)ZaspectÚinterpolationr/   r.   )r1   rj   r&   rk   )r=   rn   rp   rq   rr   ÚTÚminrv   r6   Zsubplotsr7   ru   Zfloat_r?   rC   r<   rz   r�   r‡   )	rU   r   r€   rE   Zmin_xr„   r2   rF   rˆ   r,   r,   r-   Útimeseries_as_heatmapž   s&    

ü"r�   z#eec900z#cd2626z#eee685z#9fb6cdz#7ccd7cz#ee5c42z#ccccccz#e5e5e5z#8b7e66z#a6a6a6z#1a1a1az#333333z#7f7f7fz#4d4d4dz#666666z#eedfccz#c4c4c4z#8b8989z#66cd00z#8b8b00z#bcee68z#9acd32z#c1cdcdz#d02090z#8968cdz#551a8bz#2e8b57z#9ac0cdz#b452cdz#cd5555z#999999z#e066ffz#cd96cdz#cd6889)"Zgold2Z
firebrick3Zkhaki2Z
slategray3Z
palegreen3Ztomato2Zgrey80Zgrey90Úwheat4Zgrey65Zgrey10Zgrey20Úgrey50Úgrey30Zgrey40Zantiquewhite2Zgrey77Zsnow4Úchartreuse3Úyellow4Zdarkolivegreen2Z
olivedrab3Zazure3Z	violetredZmediumpurple3Úpurple4Z	seagreen4Z
lightblue3Zorchid3zindianred 3Zgrey60Zmediumorchid1Úplum3Zpalevioletred3c                 C   sž   |dkrBt td tƒs:td dk r:tjrBt d¡ dt_ntd }tjjddd� |dkr`tj	}tj| › tj
› d|› � }t d	|› �¡ tj||d
d� dS )z¸Save current figure to file.

    The `filename` is generated as follows:

        filename = settings.figdir / (writekey + settings.plot_suffix + '.' + settings.file_format_figs)
    Nzsavefig.dpié–   z§You are using a low resolution (dpi<150) for saving figures.
Consider running `set_figure_params(dpi_save=...)`, which will adjust `matplotlib.rcParams['savefig.dpi']`FT)ÚparentsÚexist_okrd   zsaving figure to file Ztight)ÚdpiZbbox_inches)rl   r   Ústrr   Z_low_resolution_warningÚloggÚwarningZfigdirÚmkdirZfile_format_figsZplot_suffixr6   Úsavefig)Úwritekeyr›   ÚextÚfilenamer,   r,   r-   r      s"    ÿ
þÿr    )r¡   r4   r›   r¢   r5   c                 C   s    t |tƒrN|d krBdD ]*}| |¡r|dd … }| |d¡} qBq| |7 } d}|d kr\tjn|}|d krntjn|}|r„t| ||d� |r�t 	¡  |rœt 
¡  d S )N)z.svgz.pdfz.pngr   rX   T)r›   r¢   )rl   rœ   ÚendswithÚreplacer   ZautosaveZautoshowr    r6   r4   Úclose)r¡   r4   r›   r¢   r5   Ztry_extr,   r,   r-   r@   #  s"    

r@   )r[   Úreturnc                 C   s,   | d krt d S t| tƒs$t| d�S | S d S )Núaxes.prop_cyclerk   )r   rl   r   r   ©r[   r,   r,   r-   ro   ?  s
    

ro   c                 C   s˜   g }|› d�}| j | D ]R}t|ƒs`|tkr6t| }n*t d|› d|› d�¡ t| |ƒ d} ql| |¡ q|dk	r”t|ƒt| j | ƒkr”|| j |< dS )a3  
    checks if the list of colors in adata.uns[f'{key}_colors'] is valid
    and updates the color list in adata.uns[f'{key}_colors'] if needed.

    Not only valid matplotlib colors are checked but also if the color name
    is a valid R color name, in which case it will be translated to a valid name
    Ú_colorsz.The following color value found in adata.uns['z_colors'] is not valid: 'z''. Default colors will be used instead.N)Úunsr   Úadditional_colorsr�   rž   Ú'_set_default_colors_for_categorical_obsÚappendÚlist)ÚadataÚkeyZ_paletteÚ	color_keyr\   r,   r,   r-   Ú_validate_paletteH  s    	

ÿ
r³   r©   c                    sf  ddl m‰ | j| jj}tˆtƒr`ˆt ¡ kr`t 	ˆ¡}‡fdd„|t
 ddt|ƒ¡ƒD ƒ}nôtˆtjƒr‚‡‡fdd„|D ƒ}nÒtˆtjƒ�r
tˆƒt|ƒk rÀt dtˆƒ› dt|ƒ› d	�¡ g }ˆD ]6}t|ƒsô|tkræt| }ntd
|› �ƒ‚| |¡ qÈt|d�‰tˆtƒ�stdƒ‚dˆjk�r2tdƒ‚ˆƒ ‰ ‡ ‡fdd„tt|ƒƒD ƒ}|| j|d < dS )aì  
    Sets the adata.uns[value_to_plot + '_colors'] according to the given palette

    Parameters
    ----------
    adata
        annData object
    value_to_plot
        name of a valid categorical observation
    palette
        Palette should be either a valid :func:`~matplotlib.pyplot.colormaps` string,
        a sequence of colors (in a format that can be understood by matplotlib,
        eg. RGB, RGBS, hex, or a cycler object with key='color'

    Returns
    -------
    None
    r   ©Úto_hexc                    s   g | ]}ˆ |ƒ‘qS r,   r,   ©rG   r…   r´   r,   r-   ra   „  s     z3_set_colors_for_categorical_obs.<locals>.<listcomp>r   c                    s   g | ]}ˆˆ | d d�‘qS )T)Z
keep_alphar,   )rG   Úk)r[   rµ   r,   r-   ra   †  s     zSLength of palette colors is smaller than the number of categories (palette length: z, categories length: z+. Some categories will have the same color.z=The following color value of the given palette is not valid: rk   z‘Please check that the value of 'palette' is a valid matplotlib colormap string (eg. Set2), a  list of color names or a cycler with a 'color' key.r\   z#Please set the palette key 'color'.c                    s   g | ]}ˆt ˆ ƒd  ƒ‘qS rk   ©Únextr¶   )Úccrµ   r,   r-   ra   ¬  s     rª   N)Úmatplotlib.colorsrµ   ÚobsÚcatÚ
categoriesrl   rœ   r6   Z	colormapsZget_cmaprn   Zlinspacer=   ÚcabcÚMappingr   r�   rž   r   r¬   Ú
ValueErrorr®   r   r   Úkeysr<   r«   )r°   Úvalue_to_plotr[   r¾   r/   Zcolors_listZ_color_listr\   r,   )rº   r[   rµ   r-   Ú_set_colors_for_categorical_obsh  s>    
&ÿ
ÿ
ÿrÄ   c                    sÂ   | j | jj}t|ƒ}ttd  ¡ d ƒ|krPtd ƒ ‰ ‡ fdd„t|ƒD ƒ}nZ|dkr`tj}nJ|dkrptj	}n:|ttj
ƒkr†tj
}n$dd„ t|ƒD ƒ}t d|›d	�¡ t| ||d
|… ƒ d
S )zø
    Sets the adata.uns[value_to_plot + '_colors'] using default color palettes

    Parameters
    ----------
    adata
        AnnData object
    value_to_plot
        Name of a valid categorical observation

    Returns
    -------
    None
    r¨   r\   c                    s   g | ]}t ˆ ƒd  ‘qS rk   r¸   ©rG   r„   ©rº   r,   r-   ra   Æ  s     z;_set_default_colors_for_categorical_obs.<locals>.<listcomp>é   é   c                 S   s   g | ]}d ‘qS )Úgreyr,   rÅ   r,   r,   r-   ra   Ð  s     zthe obs value zT has more than 103 categories. Uniform 'grey' color will be used for all categories.N)r¼   r½   r¾   r=   r   rs   r<   r   Z
default_20Z
default_28Zdefault_102r�   ÚinforÄ   )r°   rÃ   r¾   Úlengthr[   r,   rÆ   r-   r­   ±  s     

ÿr­   Fc                 C   sh   |› d�}t | j| jjƒ}|r2|r2t| ||ƒ n2|| jkrZt | j| ƒ|krZt| |ƒ n
t| |ƒ d S )Nrª   )r=   r¼   r½   r¾   rÄ   r«   r³   r­   )r°   r±   r[   Zforce_update_colorsr²   Zcolors_neededr,   r,   r-   Ú,add_colors_for_categorical_sample_annotationÙ  s    
rÌ   c              	   C   s¶   dd l }t| tjƒs| g} |d kr&d}||jkr8tdƒ‚t||ƒ}| |d ¡}t||ƒ}	t	 
¡ �J t	 d¡ | D ]4}
|j||j|	 |
||d�}| d¡ | tj¡ qrW 5 Q R X d S )Nr   Ú	neighborsz6`edges=True` requires `pp.neighbors` to be run before.ZconnectivitiesÚignore)r2   ÚwidthZ
edge_coloréþÿÿÿ)Únetworkxrl   r¿   r   r«   rÁ   r   ÚGraphÚ
_get_basisÚwarningsÚcatch_warningsÚsimplefilterZdraw_networkx_edgesÚobsmZ
set_zorderZset_rasterizedr   rx   )Úaxsr°   ÚbasisZedges_widthZedges_colorZneighbors_keyÚnxrÍ   ÚgÚ	basis_keyr2   Zedge_collectionr,   r,   r-   Ú
plot_edgesç  s,    




û
rÝ   c           
         sð   t | tjƒs| g} t‡ ‡fdd„dD ƒd ƒ}|d krJtdˆ› dˆ› d�ƒ‚|dkr\t d¡ tˆ ˆƒ}ˆ j| }ˆ j|› d	ˆ› � }| D ]b}|d k	r˜|ni }	|j	|d d …d
f |d d …df |d d …d
f |d d …df f|	dt
ji—Ž qˆd S )Nc                 3   s&   | ]}|› d ˆ› �ˆ j kr|V  qdS )r„   N)r×   )rG   Úp©r°   rÙ   r,   r-   rI     s      zplot_arrows.<locals>.<genexpr>)ÚvelocityÚDeltaz"`arrows=True` requires `'velocity_z'` from scvelo or `'Delta_z'` from velocyto.rà   zpThe module `scvelo` has improved plotting facilities. Prefer using `scv.pl.velocity_embedding` to `arrows=True`.r„   r   r   ri   )rl   r¿   r   r¹   rÁ   r�   rž   rÓ   r×   Zquiverr   rx   )
rØ   r°   rÙ   Zarrows_kwdsZv_prefixrÜ   rU   ÚVr2   Zquiver_kwdsr,   rß   r-   Úplot_arrows  s:     ÿÿÿ

üûúrã   Ú2dé   c              
   C   sØ   |j | jj| |j | jk}|j|d  | }	t|	d tƒs`ddlm}
 |
|j|d  | ƒ}	t	|	ƒsvt
d |	¡ƒ‚||df ||df g}|dkr¨| ||df ¡ | j|d||	d	||j | jj| tjd
œŽ |S )z0Scatter of group using representation of data Y.rª   r   )Úrgb2hexz%"{}" is not a valid matplotlib color.r   Ú3dr   rd   Únone)rf   Úalpharg   Ú
edgecolorsrH   rh   ri   )r¼   r½   r¾   Úvaluesr«   rl   rœ   r»   ræ   r   rÁ   Úformatr®   rw   r   rx   )r2   r±   Zimaskr°   ÚYÚ
projectionÚsizeré   Úmaskr\   ræ   Údatar,   r,   r-   Úscatter_group$  s*    ø
rò   Úblue©F)rä   rç   )r2   rî   c                    s†  t |ƒ |dk	rtdƒ‚t |¡r<ˆ dkr<dtd  d ‰ nˆ dkrTdtd  d ‰ tˆ tƒsz‡ fdd„tt|ƒƒD ƒ}nˆ }dtd	  }|r’d
nd}	|rždnd}
td d }|}td d }|rÊ|d9 }||
 | d }t	dd„ |D ƒƒ}|| }t|ƒd |
 }||
 | }|| }|
| }dt|ƒd |  }| dk�rZt
j||ftdd|	d�d� ||| g}tdt|ƒƒD ]:}||d  ‰ | |d ˆ |  ¡ | |d | ¡ �qt|	gd| g|g}g }| dk�rbt|ƒD ]†\}}|d d|  }|d d }|| }|d d | }|dk�r2t
 ||||g¡} n |dk�rRt
j||||gdd�} | | ¡ �qØnt| tjƒ�rt| n| g}||||fS )z1Grid of axes for plotting, legends and colorbars.Nu+   We currently donâ€™t support `left_margin`.r   zfigure.subplot.rightgáz®GáÊ?g¸…ëQ¸®?c                    s   g | ]}ˆ ‘qS r,   r,   r^   ©Úright_marginr,   r-   ra   Q  s     zsetup_axes.<locals>.<listcomp>zfigure.subplot.topg333333Ã?g{®Gáz´?g333333Ó?rJ   r   gš™™™™™ñ?r.   c                 S   s   g | ]}d | ‘qS ©r   r,   )rG   rö   r,   r,   r-   ra   c  s     rK   rO   éÿÿÿÿr   rä   rç   )rî   )Úcheck_projectionÚNotImplementedErrorrn   Úanyr   rl   r¯   r<   r=   Úsumr6   rQ   rS   r®   rv   r   r¿   r   )r2   ÚpanelsÚ	colorbarsrö   Úleft_marginrî   Ú
show_ticksZright_margin_listZ
top_offsetZbottom_offsetZleft_offsetZbase_heightÚheightZ
base_widthÚdraw_region_widthZright_margin_factorZwidth_without_offsetsZright_offsetÚfigure_widthZdraw_region_width_fracZleft_offset_fracZright_offset_fracZleft_positionsr_   Ú	panel_posrØ   Úicolorr\   rL   rN   rÏ   r,   rõ   r-   Ú
setup_axes>  sp    

ÿÿÿ
þÿ


r  ÚDC©r   r   rå   r÷   )rí   rî   r§   c           )         sæ  t ˆtjƒr(tˆƒ}‡fdd„|D ƒ}nˆ}g }t |tƒr@|g}tˆƒt|ƒkrvtˆƒdkrv‡fdd„tt|ƒƒD ƒ‰t|||||||d�\}}}}t|ƒD �]”\}}|| }|d d }|d d | }| }t	|ƒsô|rôt
 |¡}|| }| | }|dk�r |dd…df |dd…df f}nJ|d	k�rZ|dd…df |dd…df |dd…d
f f}ntd|›d�ƒ‚t |tƒ�r€|dk�r¢|j|d||dˆ| |tjdœŽ}|| �rd| t|ƒ }|d
 d
| d  |d	k�rÜdnd|  } | |||g}!t ¡ }"|" |!¡}#tj|t t¡|#d�}$|dk	�r2| || ¡ t|ƒD ]Ì\}%}&t |&tƒ�rR|&nt|&ƒ}&| |&df g| |&df gf}d	|k�r¨| |&df g| |&df g| |&d
f gf}|j|dddddddœŽ t|ƒdk�rØ||% nt|&ƒ}'|jdd„ |D ƒ|'g ddddœŽ �q:|sœ| g ¡ | g ¡ d	|krœ| g ¡ qœˆ dk�r\‡‡fdd„tt|ƒƒD ƒ‰ n‡ fdd„tt|ƒƒD ƒ‰ t|ƒD ]N\}(}| ˆ |( d ¡ | ˆ |( d ¡ d	|k�r~|jˆ |( d
 dd� �q~|D ]}|  ¡  �qÒ|S ) zóPlot scatter plot of data.

    Parameters
    ----------
    Y
        Data array.
    projection

    Returns
    -------
    Depending on whether supplying a single array or a list of arrays,
    return a single axis or a list of axes.
    c                    s   g | ]}ˆ | ‘qS r,   r,   r^   )Ú
highlightsr,   r-   ra   ²  s     z scatter_base.<locals>.<listcomp>r   c                    s   g | ]}ˆ d  ‘qS ©r   r,   rÅ   )Úsizesr,   r-   ra   º  s     )r2   rý   rþ   rî   rö   rÿ   r   r   rä   Nrç   r   zUnknown projection z not in '2d', '3d'Úwhiterd   rè   )rf   rg   ré   rê   rH   r/   ri   gú~j¼t“x?g333333ó?gš™™™™™É?)rì   Zcaxr&   r…   é
   rÇ   )rg   Z
facecolorsrê   rf   rH   Úzorderc                 S   s   g | ]}|d  ‘qS r
  r,   )rG   Údr,   r,   r-   ra     s     )r  Zfontsizer\   c                    s   g | ]}‡fd d„ˆ D ƒ‘qS )c                    s   g | ]}ˆ t |ƒ ‘qS r,   )rœ   r^   )Úcomponent_namer,   r-   ra     s     z+scatter_base.<locals>.<listcomp>.<listcomp>r,   rÅ   )Úcomponent_indexnamesr  r,   r-   ra     s   ÿc                    s   g | ]}ˆ ‘qS r,   r,   rÅ   )Úaxis_labelsr,   r-   ra     s     iùÿÿÿ)Zlabelpad)!rl   r¿   rÀ   Úsortedrœ   r=   r<   r  rv   r   rn   ZargsortrÁ   rw   r   rx   r6   ZgcfZadd_axesr?   r   ÚFuncFormatterÚticks_formatterr:   ÚintÚtextr;   r>   Z
set_zticksr8   r9   Z
set_zlabelZautoscale_view))rí   r‚   Z
sort_orderré   r	  rö   rÿ   rî   rD   r  r  r  rþ   r  rE   r   r2   Zhighlights_indicesZhighlights_labelsrØ   r  r  r  r  r\   rN   r  ZY_sortÚsortrñ   ZsctrÏ   rL   Z	rectangleÚfigZax_cbr„   ZiihighlightZ
ihighlightÚhighlight_textZiaxr,   )r  r  r  r	  r  r-   Úscatter_base�  sÊ     
ù	

"
0ø

ÿÿ
  ÿ

(ù
ÿýü



þ
r  )r2   rí   c                 O   s|   d|kr"|j d dkrdnd|d< d|kr2d|d< | j|dd…df |dd…d	f f|d
tji—Ž |  g ¡ |  g ¡ dS )z±Plot scatter plot of data.

    Parameters
    ----------
    ax
        Axis to plot on.
    Y
        Data array, data to be plotted needs to be in the first two columns.
    rH   r   éô  r   r  rê   re   Nr   ri   )rq   rw   r   rx   r;   r>   )r2   rí   ÚargsrV   r,   r,   r-   Úscatter_single!  s    
2
r  )r2   rU   Úindicesc                 C   s  d}t | dƒ}|jd dkr*d}t | dƒ}|jd dkrFd}t | d	ƒ}d
| }t|ƒD ]º\}}|| dkrlqV|||  | }	t|	jd ƒD ]„}
d}|}|}|dk	rÂ||||
f 9 }||||
f 9 }t |	|
dd…f ¡sÚqŠ| j|d |d |	|
df |	|
df d|||dd�	 qŠqVdS )zü
    Plot arrows of transitions in data matrix.

    Parameters
    ----------
    ax
        Axis object from matplotlib.
    X
        Data array, any representation wished (X, psi, phi, etc).
    indices
        Indices storing the transitions.
    r   gü©ñÒMbP?r   i,  é   gü©ñÒMb@?r  é   g-Cëâ6?r  NTrÉ   )Zlength_includes_headrÏ   Ú
head_widthré   r\   )Úaxis_to_datarq   rv   r<   rn   rû   Úarrow)r2   rU   r  ÚweightÚsteprÏ   r"  Zixr…   ZX_stepZitransZalphaiZwidthiZhead_widthir,   r,   r-   Úarrows_transitions4  sB    




÷r'  c                 C   s   | d› d¡ d¡S )Nz.3fÚ0rd   )r  Úrstrip)r…   Úposr,   r,   r-   r  e  s    r  c                 C   s   |   t t¡¡ dS )zRemove trailing zeros.N)Zset_major_formatterr   r  r  )Z	x_or_y_axr,   r,   r-   Ú	pimp_axiso  s    r+  c                 C   s    | t  | ¡ }|t  |¡ }|S )z?Take some 1d data and scale it so that min matches 0 and max 1.)rn   r�   Úmax)r…   Zxscaledr,   r,   r-   Úscale_to_zero_onet  s    r-  ç      ð?c                    sŠ   d‰d‰ |ddf‡ ‡‡‡fdd„	‰|dddf‡ ‡‡‡‡‡‡fdd„	‰ˆdkrVˆi ƒ‰n‡ ‡fd	d
„ˆ  ¡ D ƒ‰|tˆ ¡ ƒd  ‰ˆi ƒS )a3  Tree layout for networkx graph.

    See https://stackoverflow.com/questions/29586520/can-one-get-hierarchical-graphs-from-networkx-with-python-3
    answer by burubum.

    If there is a cycle that is reachable from root, then this will see
    infinite recursion.

    Parameters
    ----------
    G: the graph
    root: the root node
    levels: a dictionary
            key: level number (starting from 0)
            value: number of nodes in this level
    width: horizontal space allocated for drawing
    height: vertical space allocated for drawing
    ÚtotalÚcurrentr   Nc                    sl   || krˆdˆ di| |< | | ˆ  d7  < t ˆ |¡ƒ}|dk	rL| |¡ |D ]}ˆ| ||d |ƒ} qP| S )z*Compute the number of nodes for each levelr   r   N©r¯   rÍ   Úremove)rƒ   ÚnodeÚcurrentLevelÚparentrÍ   Úneighbor)ÚCURRENTÚGÚTOTALÚmake_levelsr,   r-   r:  ‘  s    
z"hierarchy_pos.<locals>.make_levelsc           	         s’   dˆ| ˆ  }|d }||ˆ| ˆ    ˆ |f| |< ˆ| ˆ   d7  < t ˆ |¡ƒ}|d k	rl| |¡ |D ]}ˆ| ||d ||ˆ ƒ} qp| S )Nr   r   r1  )	r*  r3  r4  r5  Zvert_locZdxrL   rÍ   r6  )r7  r8  r9  rƒ   Úmake_posÚvert_gaprÏ   r,   r-   r;  �  s     
zhierarchy_pos.<locals>.make_posc                    s   i | ]\}}|ˆ|ˆ d i“qS r
  r,   )rG   r·   Úv)r7  r9  r,   r-   Ú
<dictcomp>¬  s      z!hierarchy_pos.<locals>.<dictcomp>r   )Úitemsr,  rÂ   )r8  Úrootrƒ   rÏ   r  r,   )r7  r8  r9  rƒ   r:  r;  r<  rÏ   r-   Úhierarchy_pos{  s    "
rA  c                    s*   dd l }|d f‡ ‡‡fdd„	‰ˆ| ¡ ƒS )Nr   c                    s�   |   |¡ ˆ  |¡}|d k	r2|  ||¡ | |¡ |}ˆt|ƒ D ]2}t|ƒd t|ƒ }|   |¡ |  ||¡ |}qB|D ]}ˆ| ||ƒ} qz| S )Nr„   )Úadd_noderÍ   Zadd_edger2  r  rœ   )Zsc_Gr3  r5  rÍ   Úold_nodeÚnÚnew_noder6  ©r8  Úmake_sc_treeÚ	node_setsr,   r-   rG  ´  s    



z"hierarchy_sc.<locals>.make_sc_tree)rÑ   rÒ   )r8  r@  rH  rÚ   r,   rF  r-   Úhierarchy_sc±  s    rI  r…   c                 C   sp   |dkr|   ¡ n|  ¡ }d|d |d   d| t d¡ |d |d    }|dkrb|  |¡ n
|  |¡ dS )z3Zoom into axis.

    Parameters
    ----------
    r…   r.   r   r   r.  )g      à¿r.   N)Úget_xlimry   rn   ru   r|   r{   )r2   ZxyÚfactorZlimitsZ
new_limitsr,   r,   r-   ÚzoomÇ  s    ÿþrL  )r2   r  c                 C   s:   |   ¡  |j ¡ ¡}|j|j }}||j9 }||j9 }dS )zuGet axis size

    Parameters
    ----------
    ax
        Axis object from matplotlib.
    fig
        Figure.
    N)Zget_window_extentZtransformedZdpi_scale_transÚinvertedrÏ   r  r›   )r2   r  ZbboxrÏ   r  r,   r,   r-   Úget_ax_size×  s    

rN  )r2   rÏ   c                 C   sD   |   ¡ }||d |d   }|  ¡ }||d |d   }d||  S )zÐFor a width in axis coordinates, return the corresponding in data
    coordinates.

    Parameters
    ----------
    ax
        Axis object from matplotlib.
    width
        Width in xaxis coordinates.
    r   r   r.   )rJ  ry   )r2   rÏ   r�   Zwidthxr‡   Zwidthyr,   r,   r-   r#  ç  s
    r#  )r2   Úpoints_axisc                 C   s   | j | j ¡  }| |¡S )z×Map points in axis coordinates to data coordinates.

    Uses matplotlib.transform.

    Parameters
    ----------
    ax
        Axis object from matplotlib.
    points_axis
        Points in axis coordinates.
    )Z	transAxesZ	transDatarM  Z	transform)r2   rO  r#  r,   r,   r-   Úaxis_to_data_pointsù  s    rP  )r2   Úpoints_datac                 C   s   t  ¡ }||ƒS )z×Map points in data coordinates to axis coordinates.

    Uses matplotlib.transform.

    Parameters
    ----------
    ax
        Axis object from matplotlib.
    points_data
        Points in data coordinates.
    )r#  rM  )r2   rQ  Zdata_to_axisr,   r,   r-   Údata_to_axis_points	  s    rR  c                 C   sV   | dkrt d| › d�ƒ‚| dkrRddlm} |tjƒ}||dƒk rRtdtj› �ƒ‚d	S )
z#Validation for projection argument.>   rä   rç   z&Projection must be '2d' or '3d', was 'z'.rç   r   )Úparsez3.3.3z/3d plotting requires matplotlib > 3.3.3. Found N)rÁ   Zpackaging.versionrS  ÚmplÚ__version__ÚImportError)rî   rS  Zmpl_versionr,   r,   r-   rù     s    

ÿrù   Úbc	                 K   s”   |dkr| | } || }t  | ||¡}
dd„ |
D ƒ}t|f|	Ž}t|t jƒr|t  |jt j¡r|| t j	 
|¡¡ | ||¡ n
| |¡ | |¡ |S )a[  
    Taken from here: https://gist.github.com/syrte/592a062c562cd2a98a83
    Make a scatter plot of circles.
    Similar to pl.scatter, but the size of circles are in data scale.
    Parameters
    ----------
    x, y : scalar or array_like, shape (n, )
        Input data
    s : scalar or array_like, shape (n, )
        Radius of circles.
    c : color or sequence of color, optional, default : 'b'
        `c` can be a single color format string, or a sequence of color
        specifications of length `N`, or a sequence of `N` numbers to be
        mapped to colors using the `cmap` and `norm` specified via kwargs.
        Note that `c` should not be a single numeric RGB or RGBA sequence
        because that is indistinguishable from an array of values
        to be colormapped. (If you insist, use `color` instead.)
        `c` can be a 2-D array in which the rows are RGB or RGBA, however.
    vmin, vmax : scalar, optional, default: None
        `vmin` and `vmax` are used in conjunction with `norm` to normalize
        luminance data.  If either are `None`, the min and max of the
        color array is used.
    kwargs : `~matplotlib.collections.Collection` properties
        Eg. alpha, edgecolor(ec), facecolor(fc), linewidth(lw), linestyle(ls),
        norm, cmap, transform, etc.
    Returns
    -------
    paths : `~matplotlib.collections.PathCollection`
    Examples
    --------
    a = np.arange(11)
    circles(a, a, s=a*0.2, c=a, alpha=0.5, ec='none')
    pl.colorbar()
    License
    --------
    This code is under [The BSD 3-Clause License]
    (http://opensource.org/licenses/BSD-3-Clause)
    r.  c                 S   s    g | ]\}}}t ||f|ƒ‘qS r,   r   )rG   Zx_Zy_Zs_r,   r,   r-   ra   W  s     zcircles.<locals>.<listcomp>)rn   Ú	broadcastr   rl   ÚndarrayZ
issubdtyper‹   ÚnumberZ	set_arrayÚmaZmasked_invalidZset_climZset_facecolorZadd_collection)r…   r†   rH   r2   rf   rg   ÚvminÚvmaxZscale_factorrV   ZzippedZpatchesZ
collectionr,   r,   r-   Úcircles'  s    ,

r^  )Úax_or_figsizeÚnrowsÚncolsÚwspaceÚhspaceÚwidth_ratiosÚheight_ratiosr§   c           
      C   s„   t ||||d�}t| tƒr:tj| d�}|tj||f|ŽfS | }	|	 d¡ |	 d¡ |	 	g ¡ |	 
g ¡ |	j|	 ¡ j||f|ŽfS d S )N)rb  rc  rd  re  rŠ   ÚoffF)Údictrl   rR   r6   rQ   r   ZGridSpecZaxisZset_frame_onr;   r>   Zget_subplotspecZsubgridspec)
r_  r`  ra  rb  rc  rd  re  Úkwr  r2   r,   r,   r-   Úmake_grid_specd  s    	ü




ri  c                 K   s   |  | ¡ |S )aw  
    Given a dictionary of plot parameters (kwds_dict) and a dict of kwds,
    merge the parameters into a single consolidated dictionary to avoid
    argument duplication errors.

    If kwds_dict an kwargs have the same key, only the value in kwds_dict is kept.

    Parameters
    ----------
    kwds_dict kwds_dictionary
    kwargs

    Returns
    -------
    kwds_dict merged with kwargs

    Examples
    --------

    >>> def _example(**kwds):
    ...     return fix_kwds(kwds, key1="value1", key2="value2")
    >>> example(key1="value10", key3="value3")
        {'key1': 'value10, 'key2': 'value2', 'key3': 'value3'}

    )Úupdate)Z	kwds_dictrV   r,   r,   r-   Úfix_kwds  s    
rk  rß   c                 C   s6   || j  ¡ kr|}nd|› �| j  ¡ kr2d|› �}|S )NZX_)r×   rÂ   )r°   rÙ   rÜ   r,   r,   r-   rÓ   Ÿ  s
    
rÓ   c                 C   s�   ddl m} zddl m} W n  tk
r<   ddl m} Y nX |d k	rh| d k	s^|d k	s^|d k	rŒtdƒ‚n$|d k	r€|| ||d�}n|| |d�}|S )Nr   )Ú	Normalize)ÚTwoSlopeNorm)ÚDivergingNormz7Passing both norm and vmin/vmax/vcenter is not allowed.)r\  r]  Úvcenter)r\  r]  )r»   rl  rm  rV  rn  rÁ   )r\  r]  ro  Znormrl  ZDivNormr,   r,   r-   Úcheck_colornormª  s    
rp  )
NNNNNr.   NNNN)NNr,   r,   rX   rY   NNTNrZ   N)r,   r,   N)NN)NNNN)N)NF)N)N)rä   rå   N)Nró   rô   NNrä   F)ró   TNr,   NNrä   Nr  r  Nrô   r÷   rZ   TN)N)Nr.  r.  )r…   r   )NrW  NNr.  )NNNN)NNNN)crÔ   Úcollections.abcÚabcr¿   r   Ú	functoolsr   Útypingr   r   r   r   r   r	   r
   ZanndataÚnumpyrn   Z
matplotlibrT  r   r6   r   r   r   r   Zmatplotlib.axesr   r»   r   Zmatplotlib.figurer   rS   r   Zmatplotlib.patchesr   Zmatplotlib.collectionsr   r   r   rX   r   r�   Z	_settingsr   Z_compatr   Ú_utilsr   r   rœ   rm   Z	ColorLikeZ_IGraphLayoutZ_FontWeightZ	_FontSizeZVBoundZSubplotBaser'   r3   rW   rY  rT   r�   r¬   r    Úboolr  r@   ro   r³   rÄ   r­   rÌ   rÝ   rã   rò   r  r  r  r'  r  r+  r-  rA  rI  rL  rN  r#  rP  rR  rù   r^  ZGridSpecBaseri  rk  ZAnnDatarÓ   rp  r,   r,   r,   r-   Ú<module>   s~  $ÿ          õ
!            ó
óI     ÿ ÿ=Þ*
!    ûû 	!ÿI)   ÿ


!
       ùúT                ï
î 1

6
         ÿ
A    ù

ø 