Обрабатывать края между одними и теми же узлами как разные - PullRequest
0 голосов
/ 25 февраля 2019

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

Таким образом, в приведенном ниже примере каждая ссылка представляет собой отдельный переход, мы отправляем трафик с c: 3 на d: 4 как STM-16 ион возвращается обратно к STM-4 обратно в c: 3, где он отправляется в e: 5.Поэтому я хочу отобразить все это по прямой линии.

Каждая ссылка между двумя узлами отличается и имеет отдельную метку ссылки

Пример:

edgeList=[]

start_time = time.time() 

G = nx.Graph()

G.add_edges_from([
(('a:1'), ('b:2'), {'link':'one'}),
(('b:2'), ('c:3'), {'link':'two'}),
(('c:3'), ('d:4'), {'link':'three'}),
(('d:4'), ('c:3'), {'link':'four'}),
(('c:3'), ('e:5'), {'link':'five'})
])

nx.draw(G, with_labels=True)
plt.savefig("path.png")
plt.show()

Это даетя: вывод графика

Мне нужна прямая линия, я хочу перейти от

a: 1 >> b: 2 >> c: 3>> d: 4 >> c: 3 >> e: 5

На прямой линии, а не на развилке в C3

Я не могу использовать DiGraph, потому что у меня нет направления,У меня есть неупорядоченная коллекция (node1, node2, linkname)

Кроме того, я не могу изменить имена узлов, они используются позже для получения набора атрибутов узла

1 Ответ

0 голосов
/ 25 февраля 2019

Вы нарушили основное свойство графа: данная метка однозначно идентифицирует узел.Вы сказали networkx вернуться "к c: 3", и он сделал именно то, что сказал.

Во-первых, поймите природу графа: все эти ребра существуют одновременно.При рисовании графика линейная последовательность на рисунке отсутствует.Здесь нет «назад», просто ребро со стрелкой на одном конце.

Ваше основное противоречие теории графов здесь:

we send traffic from c:3 to d:4 as STM-16
and it comes back groomed down to STM-4 
back to c:3 where it is sent on to e:5

Вы дали двум разным узлам одну и ту же метку,В терминах графа это означает, что они являются одним и тем же состоянием, но из вашего описания ясно, что вы ожидаете различных действий.Короче, решайся.Если они требуют разных действий, то это разные состояния, и вы должны описать их как таковые в спецификации вашего графа.Если у вас есть фабрика, которая помещает эти два шага в одно и то же физическое местоположение, то это ваша проблема при построении фабрики, а не забота этой графической утилиты.: -)

Я вижу две основные альтернативы:

(1) Описать ваши шаги описательно.Возвращение к месту c на самом деле является шагом 5, а не возвращением к шагу 3.

G.add_edges_from([
(('a:1'), ('b:2'), {'link':'one'}),
(('b:2'), ('c:3'), {'link':'two'}),
(('c:3'), ('d:4'), {'link':'three'}),
(('d:4'), ('c:5'), {'link':'four'}),
(('c:5'), ('e:6'), {'link':'five'})
])

(2) Дайте networkx метку, которая описывает вещи в ваших терминах,но используя декорации, которые не отображают:

G.add_edges_from([
(('a:1'), ('b:2'), {'link':'one'}),
(('b:2'), ('c:3'), {'link':'two'}),
(('c:3'), ('d:4'), {'link':'three'}),
(('d:4'), (' c:3 '), {'link':'four'}),
((' c:3 '), ('e:5'), {'link':'five'})
])

Я не уверен, что это, в частности, обманет networkx, но попробуйте.Если это не сработает, попробуйте подчеркивание или точку.В худшем случае, возможно, «c: 3.1» и «c: 3.2» удовлетворят ваши потребности.

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