2017-11-05 12 views
2

自分のMultiDiGraph()pydotグラフに変換して自己ループと矢印を表示するコードを書きましたが、変換後にpydotグラフAはすべての属性を失いましたGです。グラフAのノードサイズをどのように変更し、Gのようにnode_sizes[]リストの対応する値に設定することができますか?ピトーグラフのノードサイズを変更することはできますか?

コード:

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、詳細については以下を参照)は、我々は、ノードのサイズを変更することができあなたはpydotグラフで直接作業、(代わりにnetworkx.drawing.nx_pydot.to_pydotを呼び出すの)独自のコンバータを書きたい:

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') 

ノードのサイズを設定するための関連する属性はheightwidth、およびfixedsizeです。 GraphVizをのdocumentationから:

height

インチ内のノードの高さです。これは、ノードの最小の初期高さとみなされます。 fixedsizeがtrueの場合、これがノードの最終的な高さになります。それ以外の場合、ノードのラベルにさらに高さを合わせる必要がある場合、ノードの高さはラベルを含むように増加します。また、出力形式がドットの場合、heightに与えられた値は最終値になります。

ノードシェイプが規則的な場合、幅と高さは同じになります。この場合、幅または高さのいずれかを明示的に設定すると、その値が使用されます。この場合、幅または高さの両方を明示的に設定すると、2つの値の最大値が使用されます。どちらも明示的に設定されていない場合は、2つのデフォルト値の最小値が使用されます。

上記は、networkx == 2.0およびpydot == 1.2.3を用いて得られた。

関連する問題