6

私は深いシンボリック回帰の例の問題からこのコードを使用しています. (試行錯誤してノードサイズを指定したくありません)。どうすればいいですか?

# show tree
import matplotlib.pyplot as plt
import networkx

nodes, edges, labels = gp.graph(bests[0])
graph = networkx.Graph()
graph.add_nodes_from(nodes)
graph.add_edges_from(edges)
pos = networkx.graphviz_layout(graph, prog="dot")

plt.figure(figsize=(7,7))
networkx.draw_networkx_nodes(graph, pos, node_size=900, node_color="w")
networkx.draw_networkx_edges(graph, pos)
networkx.draw_networkx_labels(graph, pos, labels)
plt.axis("off")
plt.show()
4

4 に答える 4

5

引数 node_size は、スカラー値とベクトル値の両方を受け入れます。スカラーはすべてのノードを同じサイズにしますが、ベクトルは各ノードに使用するリスト内の個々の値を指定するのに役立ちます。ノード ID が文字列の場合、次の戦略は非常にうまく機能します。

networkx.draw_networkx_nodes各ノード ID の長さに基づいて、size 引数をリストに変更するだけです。the_base_size適切に選択してください。

networkx.draw_networkx_nodes(graph, pos, 
    node_size=[len(v) * the_base_size for v in graph.nodes()], 
    node_color="w")

これは、ラベルも処理できる場合に適応できます。

***ただし、ラベル サイズに基づいてリストからノード サイズを選択する際に、1 対 1 の対応が維持されるかどうかはわかりません。結果を共有してください。私は個人的に文字列ノード ID に使用しましたが、うまく機能します。

于 2015-09-05T23:50:23.650 に答える
1

matplotlib と networkx を使用してこれを行う簡単な方法はありません (もちろん、十分なコードがあれば可能です)。Graphviz はラベルに関して非常に優れた仕事をしており、networkx から Graphviz で処理するドット形式のファイルを簡単に作成できます。
また、必要なことを正確に行うことができるhttps://github.com/chebee7i/nxpdもご覧ください。

于 2015-01-10T17:20:15.973 に答える