U
    td(                     @   s   d 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mZ dd
lmZmZ ddlmZ dZe ZG dd de	ZdS )ze
Drawing routines to draw graphs.

This module contains routines to draw graphs on plotly surfaces.

    )defaultdict)warn)convex_hull	VertexSeq)AbstractGraphDrawer)Point   )PlotlyEdgeDrawer)PlotlyPolygonDrawer)find_plotlyformat_rgba)PlotlyVerticesDrawer)PlotlyGraphDrawerc                   @   s0   e Zd ZdZdddZeefddZdd Zd	S )
r   z/Graph drawer that uses a pyplot.Axes as contextZsquarenone)Z	rectangleZhiddenc                 C   s   || _ || _|| _dS )zConstructs the graph drawer and associates it with the plotly Figure

        @param fig: the plotly.graph_objects.Figure to draw into.

        N)figvertex_drawer_factoryedge_drawer_factory)selfr   r   r    r   T/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/igraph/drawing/plotly/graph.py__init__%   s    zPlotlyGraphDrawer.__init__c           /   
      s  ddl m}m} |rtdt  }| j}|dd }| |	dd |	dd }	|	s|	d krd|krd
 kr d	k rdd
lm}	 |	dd}
|
dkrd}
t|
}
|	d |
d|d< | ||}| ||}|j||j|d|krR|d }ddl m}m} t|tr4t| }nFt|||frXdd t|D }n"t|drnt|}nti  }|D ]\}r~|d krq~|	|}ttrdd D tdstdfddtfddD D }dtfdd|D  fdd|D }t|dkrt |d  t |d   }}|| !  }t |d  |d }|| || || || || || g}n*t dd t"| D    fdd|D }|d |d |d d|d  f}t#|}|j$|t%|t%|d  |	d!d"r~|&t'j(j)t*|g g ||d# q~|	d!d"rR|j+dd$ | ,|}| -|}j	|d krt"	}n	fd%d|D }|j$}|D ]\}}}|||| qj	|d krt"}nfd&d|D }|D ]\}}|j.||f| qj|d kr.t"} nfd'd|D } |rP|j/}n|j0}| D ]2\}!}"|!j1\}#}$|# |$  }%}&||"|%|& qZ|	d(d d k	rfd)dt2 D }'g g g g d*}(|'D ]\})}"}!|!j1\}#}$|# |$  }%}&|3|!|%|&\\}*}+\},}-|)d kr"q|(d+ 4|) |(d, 4|* |(d- 4|+ |(d. 4|"j5 qt'j(j6f d/d+i|(}.|&|. |j+d"d"d0d"d"d0d1 d S )2Nr   )VertexClusteringVertexCoverzOPositional arguments to plot functions are ignored and will be deprecated soon.palettelayout	autocurveZedge_curvedZcurvedi'  )r   Tg      ?)	attributedefaultmark_groupsc                 s   s   | ]\}}||fV  qd S Nr   ).0colorgroupr   r   r   	<genexpr>w   s     z)PlotlyGraphDrawer.draw.<locals>.<genexpr>__iter__c                 S   s   g | ]
}|j qS r   )index)r    vertexr   r   r   
<listcomp>   s     z*PlotlyGraphDrawer.draw.<locals>.<listcomp>z&group membership list must be iterablec                    s   g | ]} | qS r   r   r    i)r"   r   r   r'      s     c                    s   g | ]} | qS r   r   r    idxr   r   r   r'      s     g      ?c                 3   s   | ]} | j V  qd S r   )sizer*   )vertex_builderr   r   r#      s     c                    s   g | ]} | qS r   r   r*   r,   r   r   r'      s        r   c                 S   s    g | ]}t |tt| qS r   )sumfloatlen)r    coordsr   r   r   r'      s     c                    s   g | ]}t |   qS r   )r   Ztowards)r    point)centercorner_radiusr   r   r'      s   g      ?   )r6   	fillcolor
line_colorZlegendF)namexyr8   r9   )Z
showlegendc                 3   s$   | ]}| |  | fV  qd S r   r   r(   )r   r.   vsr   r   r#      s    c                 3   s   | ]}|  | fV  qd S r   r   r(   )r   r.   r   r   r#      s     c                 3   s   | ]}|  | fV  qd S r   r   r(   )edge_builderesr   r   r#      s     Z
edge_labelc                 3   s&   | ]}|  | j | fV  qd S r   )r?   r(   )r>   graphlabelsr   r   r#      s    )textr;   r<   r!   rB   r;   r<   r!   mode)visibleZshowticklabels)ZyaxisZxaxis)7Zigraph.clusteringr   r   r   DeprecationWarningZis_directedr   popZensure_layoutgetZedge_attributesZecountZigraphr   r1   r   r   ZVisualVertexBuilderr=   ZVisualEdgeBuilderr?   
isinstancedictiteritems	enumeratehasattrr   	TypeErrorr   maxr2   r   
normalizedzipr
   drawr   Z	add_traceplotlyZgraph_objectsZBarstrZupdate_layoutZ_determine_vertex_orderZ_determine_edge_orderZ
draw_labelZdraw_directed_edgeZdraw_undirected_edgetuplerangeZget_label_positionappendZlabel_colorZScatter)/r   r@   argskwdsr   r   Zdirectedr   r   r   r   Zvertex_drawerZedge_drawerr   Z
group_iterZcolor_idr!   ZhullpolygonabcnZ	facecolorZdrawerZvertex_orderZ
edge_orderZvertex_coord_iterZdrawer_methodr&   Zvisual_vertexr3   Zedge_coord_iteredgeZvisual_edgesrcdestZ
src_vertexZdest_vertexZedge_label_iterZlab_argslabelr;   r<   ZhalignZvalignstroker   )
r5   r6   r>   r?   r@   r"   rA   r   r.   r=   r   rR   4   s(   





$* 










zPlotlyGraphDrawer.drawN)	__name__
__module____qualname____doc__Z_shape_dictr   r	   r   rR   r   r   r   r   r      s   
r   N)rg   collectionsr   warningsr   Zigraph._igraphr   r   Zigraph.drawing.baseclassesr   Zigraph.drawing.utilsr   r_   r	   rZ   r
   utilsr   r   r&   r   __all__rS   r   r   r   r   r   <module>   s   