1

次の距離行列があります。

delta =
[[ 0.          0.71370845  0.80903791  0.82955157  0.56964983  0.          0.        ]
 [ 0.71370845  0.          0.99583115  1.          0.79563006  0.71370845
   0.71370845]
 [ 0.80903791  0.99583115  0.          0.90029133  0.81180111  0.80903791
   0.80903791]
 [ 0.82955157  1.          0.90029133  0.          0.97468433  0.82955157
   0.82955157]
 [ 0.56964983  0.79563006  0.81180111  0.97468433  0.          0.56964983
   0.56964983]
 [ 0.          0.71370845  0.80903791  0.82955157  0.56964983  0.          0.        ]
 [ 0.          0.71370845  0.80903791  0.82955157  0.56964983  0.          0.        ]]

そして、networkxライブラリを使用してグラフとして表現しようとしています。これは私のコードです:

import networkx as nx

G = nx.from_numpy_matrix(delta) 
pos = nx.random_layout(G) 

plt.figure(figsize=(7, 7))
for k, p in pos.iteritems():
    plt.scatter(p[0], p[1], marker='o', c=colors[k], s=50, edgecolor='None')
lgd = plt.legend(markers, labels, numpoints=1, bbox_to_anchor=(1.17, 0.5))
plt.tight_layout()
plt.axis('equal')
pt.show()

しかし、私が見ているものは、私が期待するものではありません。たとえば、次の出力を検討してください。

ここに画像の説明を入力

からdelta、ノード 1 はノード 6 および 7 と同じポイントにあり、ノード 4 からは離れています。出力プロットに が表示されません。その上、残業して実行すると、別の出力が得られます。これは予想どおりですが、距離が尊重されていないようです。たとえば、次のプロットでは、1 から 6、7 と 4 の間の距離が変更されています。

ここに画像の説明を入力

理由がわかりません。

4

2 に答える 2

1

を使用してnx.random_layoutいます。これは、一様分布から引き出されたランダムな位置にグラフの頂点を配置します。nx.spring_layout、別名などの他のレイアウトがあり、nx.fruchterman_reingold_layoutそれらの距離が指定された距離に近づくように頂点を配置しようとします。

于 2016-03-31T17:48:33.327 に答える
1

shell_layout() やcircular_layout()など、もう少し一貫性のあるレイアウトを使用できます。技術的には、一般的な抽象グラフでは、描かれた場所に実際の意味はなく、これらの関数のそれぞれは、その事実を反映して呼び出すたびに少しずつ変化する傾向があります。それらは、定義済みのパターンに従って合理的な方法でノードを配置するだけです。

一貫した配置が必要な場合は、自分で行う必要があります。

レイアウト関数が生成する構造を理解し、データの理解を使用して、より賢明な視覚化を生成します。これらの関数は、長さ 2 のリストである値を持つノードをキーとする辞書を生成します。最初のエントリはノードの x 位置を指定し、2 番目のエントリは y を指定します。
この例では、オフィス間のネットワーク接続のグラフを取り上げます。

pos=nx.spring_layout(G)
print pos

のようなものが得られるかもしれません

{'A': [1, 12], 'C': [5, 8], 'B': [4, 11], 'E': [8, 3], 'D': [8, 7], 'F': [6, 1]}

ただし、私のデータは都市を表しているため、物理的な場所を表す場所にノードを表示するのが理にかなっていることがわかっているので、代わりに独自の辞書を作成します (各ノードには、初期化された 'x' と 'y' の属性が既にあります)。 )。

pos = {}
for node in G.nodes():
    pos[node] = [G.node[node]["x"], G.node[node]["y"]]

これにより、毎回同じ方法でノードが表示されます。マトリックスに基づいて、同様の方法で独自のpos辞書を作成します。

于 2016-04-27T09:24:18.747 に答える