Построение ориентированных графов в Python таким образом, чтобы все ребра отображались отдельно

Я использую Python для имитации процесса, происходящего на ориентированных графах. Я хотел бы произвести анимацию этого процесса.

Проблема, с которой я столкнулся, заключается в том, что большинство библиотек Python для визуализации графов объединяют пары направленных ребер в одно ребро. Например, NetworkX рисует только два ребра при отображении следующего графика, в то время как я хотел бы отображать каждое из четырех ребер отдельно:

import networkx as nx
import matplotlib.pyplot as plt 

G = nx.MultiDiGraph()

G.add_edges_from([
    (1, 2),
    (2, 3),
    (3, 2),
    (2, 1),
])

plt.figure(figsize=(8,8))
nx.draw(G)

Output from NetworkX; parallel edges are overlapping, so only two lines are displayed

Я хотел бы отображать что-то вроде этого, с каждым параллельным ребром отдельно:

Desired output format; parallel edges are drawn separately

Вопрос Взаимные ребра R в igraph в R , кажется, имеет дело с той же проблемой, но решение есть для библиотеки R igraph, а не для Python.

Есть ли простой способ создать график такого типа, используя существующую библиотеку визуализации графов Python? Было бы неплохо, если бы он мог поддерживать мультиграфы.

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

22
задан Community 23 May 2017 в 12:34
поделиться