Как увеличить расстояние между узлами для networkx.spring_layout

Рисование кликового графа с помощью

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, похоже, не действует.

Каков правильный способ улучшить рисунок?


person clstaudt    schedule 11.01.2013    source источник
comment
Помимо ответа, приведенного ниже, я также обнаружил, что увеличение размера фигуры помогает.   -  person ericmjl    schedule 03.05.2016


Ответы (3)


Решение этой проблемы заключается в версии 1.8 NetworkX, которая еще не выпущена, но доступна через git hub.

Чтобы увеличить расстояние между узлами, сделайте следующее:

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

Настройте эти параметры, чтобы увидеть, как это работает. Но, несмотря на это, нет гарантии, что все узлы не перекрываются.

person Vikram    schedule 25.06.2013
comment
Согласно networkx.org/documentation/stable/reference/ сгенерировано /, k=1/n^(1/2), поэтому оно нестабильно на уровне 0,1 - person MERose; 14.01.2021

Я использовал параметр оптимального расстояния макета Kamada Kawai и установил расстояние между несвязанными компонентами на максимальное расстояние на графике. Возможно, есть лучший способ изменить словари, но это довольно просто:

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())
person James Houghton    schedule 26.04.2018

реальный ответ на ваш вопрос заключается в том, что ваш исходный график не является единичным, полносвязный компонент. Это три отдельных графика.

Что происходит, так это то, что три части улетают в бесконечность, что при повторном масштабировании делает каждый компонент похожим на крошечный шарик.

Алгоритм spring_layout определяет силу отталкивания между всеми узлами (антигравитация) и силу притяжения между только соединенными узлами («пружины»).

Таким образом, если граф не связан, отдельные части улетят от силы отталкивания, поскольку их ничто не связывает. Есть два варианта: изменить закон силы (отредактировать код networkx) или построить график компонентов отдельно.

Вот как добавить силу, притягивающую все узлы к центру диаграммы. Добавьте последнюю строку этого фрагмента кода в def _fruchterman_reingold в 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))

Эта единственная строка кода позволяет создавать диаграммы типа:  введите здесь описание изображения , а не  введите описание изображения здесь Однако" лучший "способ справиться с этим - это нанести на диаграмму компоненты по отдельности.

Вы можете перебирать компоненты, отображая их на отдельных графиках, с помощью описанных функций здесь.

Дополнительную информацию см. В этой проблеме с github.

person OrangeSherbet    schedule 26.02.2019