Установите длину ребер в соответствии с весами в graphviz_layout - PullRequest
4 голосов
/ 10 марта 2019

Я пытаюсь использовать networkx для построения взвешенного графика.Я генерирую позиции вершин, используя graphviz_layout.Я хочу, чтобы длины ребер на графике были пропорциональны весам ребер, которые я использую.Ниже приведен фрагмент кода для достижения этой цели:

import networkx as nx
from networkx.drawing.nx_agraph import graphviz_layout

G = nx.Graph()
G.add_weighted_edges_from(edgelist)
pos = graphviz_layout(G)
nx.draw_networkx(G, pos=pos)

Это не влияет на длину ребер на графике.Я видел этот пост , однако он только описывает, как передать один вес по умолчанию для всех ребер в graphviz_layout (или, возможно, я не понял решения).

Как я могуизменить мой фрагмент для построения графика с длинами, пропорциональными весам ребер?

В приведенном выше фрагменте кода edgelist представляет собой список списков этого формата:

edgelist = [[4, 219, 1.414], [4, 7, 3.86]]

1 Ответ

0 голосов
/ 12 июня 2019

Ключ должен установить атрибут len ребер, как описано в документации Graphviz (и доступно для Neato). Обратите внимание, что это предпочтительная длина ребра, поэтому у вас не будет полного контроля. Например, вы можете добавить одно взвешенное ребро (u, v, w) к графику G примерно так:

G.add_edge(u, v, len=w)

Вот полный пример использования графа флорентийских семейств :

# Load modules
import networkx as nx
from networkx.drawing.nx_agraph import graphviz_layout
import matplotlib.pyplot as plt

# Construct the graph, choosing some edges to be longer
G = nx.generators.social.florentine_families_graph()
lengths = dict()
long_edges = { frozenset(['Salviati', 'Pazzi']),
               frozenset(['Ginori', 'Albizzi']) }
for edge in G.edges():
    if frozenset(edge) in long_edges:
        lengths[edge] = dict(len=2)
    else:
        lengths[edge] = dict(len=1)

nx.set_edge_attributes(G, lengths)

# Plot and show
pos = graphviz_layout(G, prog='neato')
nx.draw_networkx(G, pos=pos)

plt.tight_layout()
plt.show()

Чтобы проиллюстрировать разницу в разметке при использовании длин ребер, вот результат, в котором я установил два ребра узлов степени один («Джинори» и «Пацци») более длинными: Florentine with some longer edges

И вот результат не с использованием любой длины ребра: Florentine with all edges lengths the same

...