networkxとagraphのちょっとよくわからない挙動
networkxのMultiDiGraphをagraphに変換すると、ちょっとよくわからない挙動が発生したのでメモ。
google colabで実験する。
まずライブラリの準備する。
!apt-get install graphviz libgraphviz-dev pkg-config !pip install pygraphviz import networkx as nx from IPython.display import display_svg
こちらの記事を参考にする。
エッジの定義。参考記事の数字をアルファベットに変換してある。
edges = [ ("a", "b"), ("b", "c"), ("c", "d"), ("d", "e"), ("e", "a"), # "a" ~ "e"を輪っか状に ("a", "a"), ("a", "a"), # 自己ループ ("b", "c"), ("b", "c"), # 同じ経路複数 ("b", "d"), ("b", "e"), ("d", "b"), ("e", "b") # 双方向 ]
グラフの作成と可視化。
graph = nx.MultiDiGraph() graph.add_edges_from(edges) agraph = nx.nx_agraph.to_agraph(graph) img = agraph.draw(prog="dot", format="svg") display_svg(img, raw=True)
明らかに辺が少ない。
0→1のエッジを追加する。
graph = nx.MultiDiGraph() graph.add_edge(0, 1) graph.add_edges_from(edges) agraph = nx.nx_agraph.to_agraph(graph) img = agraph.draw(prog="dot", format="svg") display_svg(img, raw=True)
これは良い。
0→0のエッジを追加する。
graph = nx.MultiDiGraph() graph.add_edge(0, 0) graph.add_edges_from(edges) agraph = nx.nx_agraph.to_agraph(graph) img = agraph.draw(prog="dot", format="svg") display_svg(img, raw=True)
ダメ。
1→1のエッジを追加する
graph = nx.MultiDiGraph() graph.add_edge(1, 1) graph.add_edges_from(edges) agraph = nx.nx_agraph.to_agraph(graph) img = agraph.draw(prog="dot", format="svg") display_svg(img, raw=True)
良い。
1のノードを追加する。
graph = nx.MultiDiGraph() graph.add_node(1) graph.add_edges_from(edges) agraph = nx.nx_agraph.to_agraph(graph) img = agraph.draw(prog="dot", format="svg") display_svg(img, raw=True)
良い。1という名前のノードがあれば良いと思われる。
"1"のノードを追加する。
graph = nx.MultiDiGraph() graph.add_node("1") graph.add_edges_from(edges) agraph = nx.nx_agraph.to_agraph(graph) img = agraph.draw(prog="dot", format="svg") display_svg(img, raw=True)
これでも良い。
結論:謎