Заданные длины ребер в сети x / igraph (Python) - PullRequest
8 голосов
/ 05 декабря 2009

Я хотел визуализировать сеть с имеющимися у меня данными и хотел бы отобразить их с определенной длиной ребра. Я использую Python, и я пробовал networkx и igraph для построения графика, но все, кажется, назначают фиксированные длины ребер.

а.) Интересно, неправильно ли я сделал код или пакеты на самом деле не способны. Как правильно реализовать заданные длины ребер для networkx или igraph?

b.) Если networkx и igraph не могут этого сделать, какой пакет вы могли бы предложить? (Предпочтительно тот, который может нести более 80 тысяч узлов.)

Спасибо!

1 Ответ

7 голосов
/ 14 декабря 2009

Это должно работать:

import networkx as NX
import pygraphviz as PG

G = PG.AGraph()
nlist = "A B C D E".split()
a, b = "A A B", "B C D"
elist = zip(a.split(), b.split())

G.add_nodes_from(nlist)
G.add_edges_from(elist)
G.node_attr.update(color="red", style="filled")
G.edge_attr.update(color="blue", len="2.0", width="2.0")

print(G.edge_attr)
# returns {'color': 'red', 'width': '', 'len': '2.0'}

# add new edge with custom length (all others have length=2.0):
G.add_edge("C", "E", len="3.0", color="blue", width="2.0")

edge = G.get_edge("C", "E")
print(edge_attr)
# returns {'color': 'blue', 'width': '2.0', 'len': '3.0'}

# and you can confirm that introspection by drawing & printing this graph:
G.draw('somefolderandfilename.png', format='png', prog='neato')

Большинство алгоритмов рисования графа используют некоторую версию SMACOF, которая, конечно, варьирует длину ребра; однако механизм компоновки graphviz 'neato' (предоставленный в качестве второго аргумента для 'draw' выше) должен сохранять, если это вообще возможно, заданные пользователем длины ребер.

Библиотека, которую я здесь использовал, безусловно, достаточно прочная, чтобы обрабатывать 80 000 узлов.

...