でクリークグラフを描く
import networkx as nx
....
nx.draw(G, layout=nx.spring_layout(G))
次の画像が生成されます。
明らかに、ノード間の間隔(たとえば、エッジの長さ)を増やす必要があります。私はこれをググってみました この提案 ここで:
一部のレイアウトアルゴリズムには、役立つ可能性がある
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
パラメーターは効果がないようです。
より良い絵を描くための正しい方法は何ですか?
申し訳ありませんが、私の質問ではこの質問には間に合いません。しかし、この問題の解決策は、まだリリースされていない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
これらのパラメーターを調整して、動作を確認します。しかし、これにもかかわらず、すべてのノードが重複していないという保証はありません
あなたの質問に対する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行のコードで、次のようなグラフを作成できます。 ではなく ただし、これに対処する「最良の」方法は、コンポーネントを個別にグラフ化することです。
here で説明されている関数を使用して、コンポーネントを反復処理し、別々のプロットでチャート化できます。
詳細については このgithubの問題 を参照してください。
鎌田川井レイアウトの最適距離パラメーターを使用し、非接続コンポーネント間の距離をグラフの最大距離に設定しました。辞書を変更するより良い方法があるでしょうが、これはかなり簡単です:
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())