Closed4

networkx の無向グラフを drawio で再現する

nikogolinikogoli

networkx でこんな感じになるデータを

 ↓
drawio でこんな感じに再現する (離れ小島を空いたスペースに移動させたくらいで、ほぼ無調整)

nikogolinikogoli

流れ

  1. networkx の Graph オブジェクトと画像描画に使う色データから、各ノードの情報を集めた DataFrame を作る
  2. 設定部分を加えて、csv ファイルとして書き出す
  3. drawio で 「配置 > 挿入 > 高度な設定 > CSV」で読み込む
  4. 「配置 > レイアウト > 系統樹」を実行するなどして、位置を調整する
nikogolinikogoli

作成する CSV ファイルの中身 (抜粋)

設定の詳細は、公式を確認すること
https://drawio-app.com/import-from-csv-to-drawio/

## ここから設定 半角スペースが入ると読み込みがうまくおこわなれないので注意
# 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 まで続く
nikogolinikogoli

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にクローズされました