Closed4
networkx の無向グラフを drawio で再現する
networkx でこんな感じになるデータを
↓
drawio でこんな感じに再現する (離れ小島を空いたスペースに移動させたくらいで、ほぼ無調整)
流れ
- networkx の Graph オブジェクトと画像描画に使う色データから、各ノードの情報を集めた DataFrame を作る
- 設定部分を加えて、csv ファイルとして書き出す
- drawio で 「配置 > 挿入 > 高度な設定 > CSV」で読み込む
- 「配置 > レイアウト > 系統樹」を実行するなどして、位置を調整する
作成する CSV ファイルの中身 (抜粋)
設定の詳細は、公式を確認すること
## ここから設定 半角スペースが入ると読み込みがうまくおこわなれないので注意
# label:%name%
# style:shape=%shape%;strokeColor=%stroke%;fontSize=16;
# namespace:csvimport-
# connect:{"from":"refs","to":"id","style":"curved=0;endArrow=none;"}
# width:auto
# height:auto
# padding:15
# ignore:id,shape,stroke,refs
# nodespacing:30
# levelspacing:100
# edgespacing:40
# layout:organic
##
## ここから データテーブル
id,name,refs,shape,stroke
0,0,"8,13,14,28",ellipse,#4682B4
1,1,"11,39",ellipse,#0000FF
2,2,"4,27",ellipse,#9ACD32
3,3,21,ellipse,#6A5ACD
4,4,"37,22",ellipse,#9ACD32
5,5,7,ellipse,#4B0082
## ...
## 以下 id=39 まで続く
CSV を作る python のコード
import matplotlib
import pandas as pd
# ここでは、G = nx.Graph() を行い、以下のようなデータが作られたとする
# G.nodes() = NodeView((0, 1, 2, ... , 39))
# G.edges() = EdgeView([(0, 8), (0, 13), (0, 14), (0, 28), ...])
# node_color = {1: 'blue', 2: 'yellowgreen', ...}
# pd.DataFrame(Dict).to_csv() で CSV にするために、ノードをキーとする辞書を作る
data = {n:{"id":n, "name":str(n), "refs":[], "shape":"ellipse"} for n in G.nodes()}
for e_set in [set(e) for e in G.edges()]: # 無向グラフなので向きが逆なだけの辺は無視
to_id, from_id = list(e_set)
data[to_id]["refs"].append(str(from_id))
for idx, color in node_color.items():
data[idx]["stroke"] = matplotlib.colors.cnames[color] #色名を16進数表示に変更
for key in data.keys():
data[key]["refs"] = ",".join(data[key]["refs"]) #リストの中身を文字列に結合
# drawio で使う設定
SETTINGS = {
"label":"%name%",
"style":'shape=%shape%; strokeColor=%stroke%; fontSize=16;',
"namespace":"csvimport-",
"connect":{"from":"refs", "to":"id", "style":"curved=0; endArrow=none;"},
"width":"auto",
"height":"auto",
"padding": 15,
"ignore":"id, shape, stroke, refs",
"nodespacing": 30,
"levelspacing": 100,
"edgespacing": 40,
"layout": "organic" # 今回のような無向グラフの場合は organic (系統図)が一番綺麗
}
settings_txt = "# "+"\n# ".join([f'{k}:{str(v)}'.replace("'", '"').replace(" ","") for k,v in SETTINGS.items()])
CSV_TXT = settings_txt+"\n" + pd.DataFrame(data).T.to_csv(index=False).replace("\r", "")
# あとは保存するなりして drawio で読み込む
このスクラップは2021/09/03にクローズされました