私は、プロット/スケッチ(matplotlibまたは他のpythonライブラリ))が、距離がスケッチされたネットワークのエッジとそのノードの線と列になるエッジである大きな距離行列の2Dネットワークを試みています。
DistMatrix =
[ 'a', 'b', 'c', 'd'],
['a', 0, 0.3, 0.4, 0.7],
['b', 0.3, 0, 0.9, 0.2],
['c', 0.4, 0.9, 0, 0.1],
['d', 0.7, 0.2, 0.1, 0] ]
そのような(大きい:数千の列と線)距離行列から2dネットワークをスケッチ/プロットするために検索しています:ノード 'a'はノード 'b'にエッジ深度0.3でリンクされ、ノード 'c'と 'd 'は、エッジ深度0.1で関連付けられます。このようなネットワークのスケッチ/グラフィック投影を取得するために使用できるツール/ライブラリは何ですか(距離行列はnumpy行列に変換できます)? (pandas、matplotlib、igraph、...?)そしていくつかはそれをすばやく実行することにつながります(私はそれを実行するために自分のTkinter関数を定義しません;-))?回答をありがとうございます。
graphviz プログラムneato
triesは、エッジの長さを考慮します。 dougは方法を示しますneato
を利用するには、次のように networkx を使用します。
import networkx as nx
import numpy as np
import string
dt = [('len', float)]
A = np.array([(0, 0.3, 0.4, 0.7),
(0.3, 0, 0.9, 0.2),
(0.4, 0.9, 0, 0.1),
(0.7, 0.2, 0.1, 0)
])*10
A = A.view(dt)
G = nx.from_numpy_matrix(A)
G = nx.relabel_nodes(G, dict(Zip(range(len(G.nodes())),string.ascii_uppercase)))
G = nx.drawing.nx_agraph.to_agraph(G)
G.node_attr.update(color="red", style="filled")
G.Edge_attr.update(color="blue", width="2.0")
G.draw('/tmp/out.png', format='png', prog='neato')
収量
ドットファイルを生成したい場合は、
G.draw('/tmp/out.dot', format='dot', prog='neato')
これは
strict graph {
graph [bb="0,0,226.19,339.42"];
node [color=red,
label="\N",
style=filled
];
Edge [color=blue,
width=2.0
];
B [height=0.5,
pos="27,157.41",
width=0.75];
D [height=0.5,
pos="69,303.6",
width=0.75];
B -- D [len=2.0,
pos="32.15,175.34 40.211,203.4 55.721,257.38 63.808,285.53"];
A [height=0.5,
pos="199.19,18",
width=0.75];
B -- A [len=3.0,
pos="44.458,143.28 77.546,116.49 149.02,58.622 181.94,31.965"];
C [height=0.5,
pos="140.12,321.42",
width=0.75];
B -- C [len=9.0,
pos="38.469,174.04 60.15,205.48 106.92,273.28 128.62,304.75"];
D -- A [len=7.0,
pos="76.948,286.17 100.19,235.18 167.86,86.729 191.18,35.571"];
D -- C [len=1.0,
pos="94.274,309.94 100.82,311.58 107.88,313.34 114.45,314.99"];
A -- C [len=4.0,
pos="195.67,36.072 185.17,90.039 154.1,249.6 143.62,303.45"];
}
次に、png
ファイルをgraphviz
neato
プログラムを使用して生成できます。
neato -Tpng -o /tmp/out.png /tmp/out.dot
この種の問題に完全に対応するnetworkxパッケージを使用できます。マトリックスを調整して、次のような単純なnumpy配列を削除します。
DistMatrix =array([[0, 0.3, 0.4, 0.7],
[0.3, 0, 0.9, 0.2],
[0.4, 0.9, 0, 0.1],
[0.7, 0.2, 0.1, 0] ])
次にnetworkxをインポートして使用します
import networkx as nx
G = G=nx.from_numpy_matrix(DistMatrix)
nx.draw(G)
グラフの加重バージョンを描画する場合は、各エッジの色を指定する必要があります(少なくとも、これを行う自動化された方法を見つけることができませんでした)。
nx.draw(G,Edge_color = [ i[2]['weight'] for i in G.edges(data=True) ], Edge_cmap=cm.winter )