Отдельные реберные стрелки в ориентированном графе python / networkx - PullRequest
2 голосов
/ 24 апреля 2020

Я хотел бы получить что-то похожее на это:

enter image description here

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

import matplotlib.pyplot as plt
import networkx as nx

G = nx.DiGraph()

G.add_edge('1','2')
G.add_edge('1','3')
G.add_edge('3','2')
G.add_edge('3','4')
G.add_edge('4','3')

nx.draw(G, node_color='w', edgecolors='k', width=2.0, with_labels=True)
plt.show()

, который выдает:

enter image description here

Однако стрелки между узлы 3 и 4 наложены друг на друга и выглядят как одна стрелка с двумя головками. Можно ли их немного разделить, чтобы сделать более очевидным тот факт, что там есть два ребра, а не один? (Я знаю, что это можно сделать с помощью pygraphviz, но я пытаюсь сделать это с помощью matplotlib).

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Я однажды разбудил утилиты рисования networkx на go, чтобы обойти эту и некоторые другие проблемы, которые у меня были. Пакет называется netgraph и поддерживает рисование структур графиков networkx и igraph (а также простых списков ребер). Он использует matplotlib под капотом и выставляет созданных художников так, что им легко манипулировать ими, даже если для этого нет встроенной функциональности.

enter image description here
1 голос
/ 24 апреля 2020

Вам понадобится MultiDiGraph для нескольких ребер между двумя узлами:

G = nx.MultiDiGraph()

G.add_edge('1','2')
G.add_edge('1','3')
G.add_edge('3','2')
G.add_edge('3','4')
G.add_edge('4','3')

Для визуализации сети вы можете использовать Graphviz, который отображает параллельные ребра. Вы можете написать график в dot и отобразить график с помощью graphviz.Source:

from networkx.drawing import nx_pydot
from graphviz import Source

nx_pydot.write_dot(G, 'multig.dot')
Source.from_file('multig.dot')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...