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

19

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

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

<code>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)
</code>

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? Было бы бонусом, если бы он мог поддерживать мультиграфы.

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

связанные сstackoverflow.com/questions/15053686/… Ioannis Filippidis

Ваш Ответ

2   ответа
11

Используя NetworkX, возможный обходной путь, который избегает файлового ввода-вывода и использует точку через pydot для разметки:

import networkx as nx
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from io import BytesIO

g = nx.dodecahedral_graph()
d = nx.drawing.nx_pydot.to_pydot(g) # d is a pydot graph object, dot options can be easily set
# attributes get converted from networkx,
# use set methods to control dot attributes after creation

png_str = d.create_png()
sio = BytesIO() # file-like string, appropriate for imread below
sio.write(png_str)
sio.seek(0)

img = mpimg.imread(sio)
imgplot = plt.imshow(img)

почемуseek(0) нужно, см.Как создать изображение из строки в Python

Если в консоли IPython (qt), то вышеприведенное напечатает inline и более прямой подход:

import networkx as nx
from IPython.display import Image

g = nx.dodecahedral_graph()
d = nx.drawing.nx_pydot.to_pydot(g)

png_str = d.create_png()
Image(data=png_str)
Error: User Rate Limit ExceededpydotplusError: User Rate Limit ExceededpydotError: User Rate Limit ExceedednetworkxError: User Rate Limit Exceededthis PR.
Error: User Rate Limit Exceedednx.to_pydotError: User Rate Limit Exceededpip install pydotplusError: User Rate Limit Exceedednx.drawing.nx_pydot.to_pydotError: User Rate Limit Exceeded
pydotplusError: User Rate Limit Exceededpydot. pydot == 1.2.3Error: User Rate Limit Exceeded$PATHError: User Rate Limit Exceededthis issueError: User Rate Limit Exceeded$PATHError: User Rate Limit Exceeded.bashrcError: User Rate Limit Exceededos.environError: User Rate Limit Exceeded
Error: User Rate Limit ExceededgraphvizError: User Rate Limit ExceededInvocationException: GraphViz's executables not foundError: User Rate Limit Exceededimport osError: User Rate Limit Exceededos.environ["PATH"] += r";C:\Anaconda\envs\testes\Library\bin\graphviz"Error: User Rate Limit Exceeded
22

Graphviz инструменты отображаются для отображения четких краев.

Например, давая это:

digraph G {
  A -> B;
  A -> B;
  A -> B;
  B -> C;

  B -> A;
  C -> B;
}

вdot производит:

example graph

Язык ввода Graphviz довольно прост, поэтому вы можете сгенерировать его самостоятельно, хотя ищите «python graphviz». поднимает пару библиотек, включаяgraphviz module on PyPI.

Вот питон, который генерирует вышеуказанный график, используяgraphviz модуль:

from graphviz import Digraph

dot = Digraph()
dot.node('A', 'A')
dot.node('B', 'B')
dot.node('C', 'C')
dot.edges(['AB', 'AB', 'AB', 'BC', 'BA', 'CB'])

print(dot.source)
dot.render(file_name, view=True)
Error: User Rate Limit Exceededexport .dot files using pydotError: User Rate Limit ExceededpygraphvizError: User Rate Limit Exceeded Josh Rosen

Похожие вопросы