28

距離がスケッチされたネットワークのエッジであり、そのノードの線と列である長距離行列の2Dネットワークをプロット/スケッチ(matplotlibまたは他のPythonライブラリ)しようとしています。

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'はエッジの深さ0.3、ノード'c'および'dによってノード'b'にリンクされています'は、エッジの深さ0.1で結ばれます。そのようなネットワークのスケッチ/グラフィック投影を取得するために使用できるツール/ライブラリは何ですか(距離行列はnumpy行列に変換できます)?(pandas、matplotlib、igraph、...?)そしてそれを素早く行うためのいくつかのリード(私はそれを行うために自分のTkinter関数を定義しません;-))?あなたの入ってくる答えに感謝します。

4

2 に答える 2

32

graphvizプログラムは、エッジの長さを尊重neato しようとします。dougは、次のようnetworkxneatoを使用して利用する方法を示しています。

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 
于 2012-11-22T14:05:51.270 に答える
19

この種の問題で完全に機能する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 )
于 2012-11-22T13:41:25.003 に答える