Как визуализировать граф с большим количеством узлов и ребер с помощью Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как визуализировать граф с большим количеством узлов и ребер с помощью Python?

Сообщение Anonymous »

Я хочу визуализировать ориентированный граф с огромным количеством узлов и ребер. Граф имеет около 2000 узлов и почти такое же количество направленных ребер между этими узлами. Ребра могут соединять два узла. Например, node_1 и node_2 могут быть соединены ребром node_1_node_2 и наоборот, node_2_node_1. Может существовать более одного узла, соединяющего эти узлы или другие узлы с этими узлами.
Я хочу визуализировать все узлы и все существующие ребра.
В настоящее время узлы и ребра находятся в таблицах CSV, но их можно загрузить в файл dict или json.
Я реализовал код с помощью Python и получил красивое и четкое изображение графика:

Изображение

Для этого я использовал следующий код:

Код: Выделить всё

from matplotlib import pyplot as plt
import networkx as nx

G = nx.MultiDiGraph([
('BAY_530', 'BAY_530_E'),
('BAY_530_E', 'BAY_530_W'),
('BAY_530_E', 'SSX_W'),
('BAY_530', 'INTR_530'),
('BAY_530_W', 'BAY_530'),
('INTR_530', 'BAY_530'),
('INTR_530', 'M_502_5'),
('M_502_1', 'M_502_2'),
('M_502_2', 'M_502_1'),
('M_502_2', 'M_502_3'),
('M_502_3', 'M_502_2'),
('M_502_3', 'M_502_4'),
('M_502_4', 'M_502_3'),
('M_502_4', 'M_502_5'),
('M_502_5', 'M_502_4'),
('M_502_5', 'SSX_S'),
('SSX_N', 'SSX_S'),
('SSX_N', 'SSX_W'),
('SSX_S', 'INTR_530'),
('SSX_S', 'SSX_N'),
('SSX_W', 'BAY_530_E'),
('SSX_W', 'SSX_N')
])

pos = nx.circular_layout(G)
#pos = nx.spring_layout(G, seed=3113794652)
names = {name: name for name in G.nodes}
options = {"edgecolors": "tab:gray", "node_size": 800, "alpha": 0.9}

nx.draw_networkx_nodes(G, pos, node_color='b', node_size=1500, alpha=1)
nx.draw_networkx_labels(G, pos, names, font_size=8, font_color='w')

ax = plt.gca()
for e in G.edges:
ax.annotate("",
xy=pos[e[1]], xycoords='data',
xytext=pos[e[0]], textcoords='data',
arrowprops=dict(arrowstyle="->", color="0",
shrinkA=10, shrinkB=10,
patchA=None, patchB=None,
connectionstyle="arc3,rad={}".format(0.3 * e[2])
)
)

plt.tight_layout()
plt.axis('off')
plt.show()
У меня это работает с небольшим количеством ребер и узлов,
но если я увеличу количество узлов, станет сложно расположить эти узлы и ребра красиво. Поскольку они перекрывают друг друга, невозможно понять, что с чем связано.
[img]https://i. sstatic.net/y7O1s.png[/img]
Я также пытался использовать наведение курсора мыши, чтобы выбрать узел, а затем выделить края, входящие и выходящие из узла.
Я должен указать здесь это для лучшего понимания связь/отношение между двумя узлами, края должны быть отдельными для каждого соединения.
Я также пробовал использовать круговой макет, но тогда он становится слишком большим и не все соединения отображаются.
Я знаю, что есть библиотека D3 в JavaScript, которая может работать для меня, но я хотел бы реализовать ее в Python.
Существует ли лучший способ реализовать это в Python или лучшая библиотека, которая может справиться с большим количеством ребер и узлов? Мне также нужна поддержка динамических элементов, таких как нажатие или наведение курсора мыши, чтобы можно было реализовать выбор узлов, а затем выделение связанных узлов и ребер.

Подробнее здесь: https://stackoverflow.com/questions/769 ... ith-python
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»