RigelのR言語メモであーる(R言語だけとは言っていない)

RigelのR言語メモであーる(主にpython)

興味あることや趣味、やったことについて書くよ

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

こちらの記事を参考にする。

cppx.hatenablog.com

エッジの定義。参考記事の数字をアルファベットに変換してある。

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)

f:id:strawberry_kyon:20200328022843p:plain

明らかに辺が少ない。

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)

f:id:strawberry_kyon:20200328022939p:plain

これは良い。

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)

f:id:strawberry_kyon:20200328023039p:plain

ダメ。

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)

f:id:strawberry_kyon:20200328023054p:plain

良い。

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)

f:id:strawberry_kyon:20200328023152p:plain

良い。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)

f:id:strawberry_kyon:20200328023316p:plain

これでも良い。

結論:謎