2017-11-05 18 views
2

MultiDiGraph()pydot 그래프로 변환하는 코드를 작성하여 자체 루프와 화살표를 표시했지만 전환 후 pydot 그래프 AG의 모든 속성을 손실했습니다. 그래프 A의 노드 크기를 어떻게 바꿀 수 있으며, G처럼 그 값을 node_sizes[] 목록의 해당 값과 동일하게 설정합니까?Pydot 그래프의 노드 크기를 변경할 수 있습니까?

코드 :

def draw_graph(graph, size): 

    # extract nodes from graph 
    nodes = set([n1 for n1, n2 in graph] + [n2 for n1, n2 in graph]) 
    print("Nodes ",nodes,"\n") 

    node_sizes = [] 

    for n in nodes: 
     #Scaling up the node importance by a factor of 2000 to make it visible 
     node_sizes.append(size[n] * 2000) 

    print("Node size ",node_sizes,"\n") 

    # create networkx graph 
    G=nx.MultiDiGraph() 

    G.add_edges_from(edges) 
    G.add_nodes_from(nodes) 

    edge_colours = ['black' for edge in G.edges()] 

    pos = nx.spring_layout(G) 
    nx.draw_networkx_nodes(G, pos, cmap=plt.get_cmap('jet'), node_size = node_sizes) 
    nx.draw_networkx_labels(G, pos) 
    nx.draw_networkx_edges(G, pos, edge_color='black', arrows=True) 

    plt.show() 

    # render pydot by calling dot, no file saved to disk 
    A=nx.to_pydot(G, strict=True) 

    png_str = A.create_png(prog='dot') 

    # treat the dot output string as an image file 
    sio = BytesIO() 
    sio.write(png_str) 
    sio.seek(0) 
    img = mpimg.imread(sio) 

    # plot the image 
    imgplot = plt.imshow(img, aspect='equal') 
    plt.show(block=False) 
+0

로컬로 실행할 수있는 전체 소스 또는 스 니펫을 공유 할 수 있습니다. –

+0

관련 항목 : https://stackoverflow.com/a/1266082/1959808 –

답변

1

networkxnetworkx.MultiDiGraph 노드와 가장자리에 표시되는 속성을 사용하여 변환하는 동안 노드와 엣지의 내적 속성을 설정합니다. 의 height 특성을 설정,이 원리를 이용

:

import networkx as nx 

h = nx.MultiDiGraph() 
h.add_node(1, label='first node') 
p = nx.drawing.nx_pydot.to_pydot(h) 
>>> p.to_string() 
'digraph {\n1 [label="first node"];\n}\n' 

(networkx == 2.0 기준으로 존재하지 않는 함수 대신 nx.to_pydotnx.drawing.nx_pydot.to_pydot를 호출도 :.) 예를 들어, g.add_node(1, label='first node')label 특성을 설정

import networkx as nx 

# create a `networkx` graph 
g = nx.MultiDiGraph() 
g.add_edge(1, 2) 
g.add_node(3, height=3) 
g.add_node(4, height=6) 
# convert to a `pydot` graph 
p = nx.drawing.nx_pydot.to_pydot(g) 
p.write_png('foo.png', prog='dot') 

경우 : 그릴 때 노드 우리는 노드의 크기를 변경할 수 있습니다 (또는 width는, 자세한 내용은 아래 참조)

import pydot 

p = pydot.Dot() 
# create one node 
nd = pydot.Node("a") 
nd.set_height('"4"') 
p.add_node(nd) 
# create another node 
nd = pydot.Node("b") 
nd.set_height('"2"') 
p.add_node(nd) 
print(p.to_string()) 
p.write_png('bar.png') 

는 노드의 크기를 설정하는 관련 속성 height, widthfixedsize이다 : 당신은 pydot 그래프와 함께 직접 작업, (대신 networkx.drawing.nx_pydot.to_pydot를 호출) 자신의 컨버터를 쓰고 싶어요. 인치 노드의

height

높이 : graphviz를의 documentation에서. 이것은 초기 노드의 최소 높이로 간주됩니다. fixedsize가 true의 경우, 이것은 노드의 최종 높이가됩니다. 그렇지 않으면 노드 레이블에 더 많은 높이가 있어야하는 경우 레이블을 포함하도록 노드의 높이가 증가합니다. 또한 출력 형식이 dot 인 경우 높이에 지정된 값이 최종 값이됩니다.

노드 모양이 규칙적이면 너비와 높이가 동일하게됩니다. 이 경우 너비 또는 높이를 명시 적으로 설정하면 해당 값이 사용됩니다. 이 경우 너비 또는 높이를 명시 적으로 설정하면 두 값 중 최대 값이 사용됩니다. 둘 다 명시 적으로 설정되지 않으면 두 기본값 중 최소값이 사용됩니다.

상기 결과는 networkx == 2.0pydot == 1.2.3을 사용하여 산출되었다.