edo1z blog

プログラミングなどに関するブログです

Python3 - ヒープをnetworkxではなくgraphvizで書いてみる

networkxだときれいに表示できない。posに表示スタイルを設定するようですが、spring_layout、spectral_layout、shell_layoutとかありますが、全部キレイな木を表示してくれる感じじゃない。外部のdotファイルとかいうのを読み込むとできるようですが、graphvizというのがあるので、そっちをやってみます。

Networkxの場合

import networkx as nx
import matplotlib.pyplot as plt

h = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
G = nx.Graph()
G.add_nodes_from(h)
for i, _ in enumerate(h):
    if(i - 1) // 2 >= 0:
        G.add_edge(h[(i - 1) // 2], h[i])
pos = nx.spring_layout(G)
nx.draw_networkx(G, pos, with_labels=True)
plt.axis("off")
plt.show()

Graphvizの場合

インストール

ここからGraphvizをダウンロードしてインストールします。 その後、下記のようにpipインストールします。

$ pip install graphviz

あと、windows10ですが、pathを通す必要がありました。インストールしたフォルダのbinをフォルダのパスを通してください。

サンプルコード

from graphviz import Graph

h = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
G = Graph(format='png')
G.attr('node', shape='circle')
for i in h: G.node(str(i))
for i, _ in enumerate(h):
    if(i - 1) // 2 >= 0:
        G.edge(str(h[(i - 1) // 2]), str(h[i]))
print(G)
G.render('heap')

参考:graphvizを使ってPython3で木構造を描く