2016-09-11 1 views
0

plotly과 파이썬을 사용하여 토폴로지 컬 컴플렉스를 플롯하려고합니다. 도전 과제는 복합체가 네트워크의 특정 섹션에서 삼각형 패널 또는면을 채색한다는 것입니다. 나는 아래 그림을 보여주기 위해 포함시켰다.플롯 네트워크 플롯에 색칠 된면 추가하기

plotly을 사용하여 이러한 색칠 된면을 플로팅 할 수 있습니까? 네트워크 다이어그램을 작동시킬 수는 있지만 얼굴을 채색하는 방법을 모릅니다.

enter image description here

답변

1

당신이 당신의 노드와 엣지를 음모 산포도를 사용하고 가정하면, layout를 통해 shapestriangles을 추가 할 수 있습니다.

다만 0; 0 1; 23; 4에 X/Y 좌표로부터 삼각형을 그리는 layout

layout = plotly.graph_objs.Layout(
    shapes=[{'type': 'graph', 
      'path': 'M 0 0 L 1 2 L 3 4 Z' 
      }] 
) 

pathshapes 키를 추가한다.

아래 코드는 here에서 수정되었으며 임의의 그래프를 생성하고 정확하게 2 개의 가장자리를 가진 모든 노드에 대한 삼각형을 그립니다.

enter image description here

import plotly 
import networkx as nx 

def scatter_nodes(pos, labels=None, color=None, size=20, opacity=1): 
    L = len(pos) 
    trace = plotly.graph_objs.Scatter(x=list(), y=list(), mode='markers', marker=plotly.graph_objs.Marker(size=list())) 
    for k in range(L): 
     trace['x'].append(pos[k][0]) 
     trace['y'].append(pos[k][1]) 
    attrib = dict(name='', text=labels , hoverinfo='text', opacity=opacity) 
    trace = dict(trace, **attrib) 
    trace['marker']['size']=size 
    return trace 

def scatter_edges(G, pos, line_color=None, line_width=1): 
    trace = plotly.graph_objs.Scatter(x=list(), y=list(), mode='lines') 
    for edge in G.edges(): 
     trace['x'] += [pos[edge[0]][0],pos[edge[1]][0], None] 
     trace['y'] += [pos[edge[0]][1],pos[edge[1]][1], None] 
     trace['hoverinfo'] = 'none' 
     trace['line']['width'] = line_width 
     if line_color: 
      trace['line']['color'] = line_color 
    return trace    

G = nx.Graph() 
n = 13 
Nodes = range(n) 
G.add_nodes_from(Nodes) 
Edges=[(0,7), (0,2), (1,3), (1,4), (1,7), (2,5), (2,8), (3, 4), (3,5), (4,6), (4,8), (5,7), (7,8), (9, 10), (9, 11), (6,10), (10, 11)] 
G.add_edges_from(Edges) 

axis = dict(showline=False, 
      zeroline=False, 
      showgrid=False, 
      showticklabels=False, 
      title='' 
     ) 
layout = plotly.graph_objs.Layout(
    showlegend=False, 
    xaxis=plotly.graph_objs.XAxis(axis), 
    yaxis=plotly.graph_objs.YAxis(axis), 
    ) 

pos = nx.fruchterman_reingold_layout(G) 

labels = [str(k) for k in range(len(pos))] 
trace1 = scatter_edges(G, pos) 
trace2 = scatter_nodes(pos, labels=labels) 

data = plotly.graph_objs.Data([trace1, trace2]) 

#let's get the triangles 
triangles = list() 
for i in range(n): 
    if len(G.neighbors(i)) == 2: 
     neighbors = G.neighbors(i) 
     triangles.append(dict(type='path', 
           path='M {0} {1} L {2} {3} L {4} {5} Z'.format(
            pos[i][0], 
            pos[i][1], 
            pos[neighbors[0]][0], 
            pos[neighbors[0]][1], 
            pos[neighbors[1]][0], 
            pos[neighbors[1]][1]), 
           fillcolor='rgba(44, 160, 101, 0.5)', 
           line=dict(color='rgb(44, 160, 101)') 
         )) 
layout.update(shapes=triangles) 
fig = plotly.graph_objs.Figure(data=data, layout=layout) 
plotly.offline.plot(fig) 
+0

은 오 와우,이 중대하다. 정말 고마워. 나는 이것을 어떻게 작동시키는지를 밝혀 내려고 노력해왔다. – krishnab

관련 문제