web-dev-qa-db-ja.com

networkx.spring_layoutのノード間隔を増やす方法

でクリークグラフを描く

import networkx as nx
....
nx.draw(G, layout=nx.spring_layout(G))

次の画像が生成されます。

enter image description here

明らかに、ノード間の間隔(たとえば、エッジの長さ)を増やす必要があります。私はこれをググってみました この提案 ここで:

一部のレイアウトアルゴリズムには、役立つ可能性があるscaleパラメータがあります。例えば.

import networkx as nx
G = nx.path_graph(4)
pos = nx.spring_layout(G)  # default to scale=1
nx.draw(G, pos)
pos = nx.spring_layout(G, scale=2)  # double distance between all nodes
nx.draw(G, pos)

ただし、scaleパラメーターは効果がないようです。

より良い絵を描くための正しい方法は何ですか?

29
clstaudt

申し訳ありませんが、私の質問ではこの質問には間に合いません。しかし、この問題の解決策は、まだリリースされていないNetworkXバージョン1.8にありますが、gitハブから入手できます。

ノード間の距離を増やすには、次の手順を実行します。

    pos = nx.spring_layout(G,k=0.15,iterations=20)
    # k controls the distance between the nodes and varies between 0 and 1
    # iterations is the number of times simulated annealing is run
    # default k =0.1 and iterations=50

これらのパラメーターを調整して、動作を確認します。しかし、これにもかかわらず、すべてのノードが重複していないという保証はありません

32
Vikram

あなたの質問に対するreal答えは、元のグラフが単一の 完全に接続されたコンポーネント ではないということです。それは3つの別々のグラフです。

起こっているのは、3つの部分が無限に飛んでいることです。これにより、再スケーリングすると、各コンポーネントが小さな塊のように見えます。

アルゴリズムspring_layoutは、allノード間の反発力(反重力)、およびonly間の引力を指定します接続されたノード(「スプリング」)。

したがって、グラフが接続されていない場合、それらを接続するものがないため、個々のピースは反発力から離れて飛びます。 2つのオプションがあります。力の法則を変更する(networkxコードを編集する)か、コンポーネントを個別にグラフ化します。

すべてのノードをグラフの中心に引き付けるフォースを追加する方法は次のとおりです。このコードスニペットの最後の行をdef _fruchterman_reingold in layouts.py に追加します。

# displacement "force"
displacement = np.einsum('ijk,ij->ik',
                         delta,
                         (k * k / distance**2 - A * distance / k))
# ADD THIS LINE - prevent things from flying off into infinity if not connected
displacement = displacement - pos / ( k * np.sqrt(nnodes))

この1行のコードで、次のようなグラフを作成できます。 enter image description here ではなく enter image description here ただし、これに対処する「最良の」方法は、コンポーネントを個別にグラフ化することです。

here で説明されている関数を使用して、コンポーネントを反復処理し、別々のプロットでチャート化できます。

詳細については このgithubの問題 を参照してください。

5
OrangeSherbet

鎌田川井レイアウトの最適距離パラメーターを使用し、非接続コンポーネント間の距離をグラフの最大距離に設定しました。辞書を変更するより良い方法があるでしょうが、これはかなり簡単です:

df = pd.DataFrame(index=G.nodes(), columns=G.nodes())
for row, data in nx.shortest_path_length(G):
    for col, dist in data.items():
        df.loc[row,col] = dist

df = df.fillna(df.max().max())

layout = nx.kamada_kawai_layout(G, dist=df.to_dict())
3
James Houghton