Перенести граф networkx в graphviz без pygraphviz

Я работаю в Python 3 на машине с Windows, и, несмотря на многие усилия, мне не удалось установить pygraphviz. Отдельное обсуждение.

У меня есть модули networkx и graphviz ... Есть ли парадигма для построения сетевых графиков в networkx и извлечения в формат graphviz для отображения, который не использует pygraphviz?

Кажется, что все соответствующие функции в drawing.nx_agraph и nx_agraph требуют pygraphviz, но я привык использовать networkx, и мне нравятся его функции. В документации для networkx даже говорится, что они сосредоточены на разработке графических объектов, а не на фактическом отображении.


person Erik    schedule 13.11.2017    source источник


Ответы (2)


Вы можете использовать pydot (https://pypi.python.org/pypi/pydot) как чистая альтернатива Python PyGraphviz

In [1]: import networkx

In [2]: import sys

In [3]: G = networkx.path_graph(4)

In [4]: networkx.drawing.nx_pydot.write_dot(G,sys.stdout)
strict graph  {
0;
1;
2;
3;
0 -- 1;
1 -- 2;
2 -- 3;
}
person Aric    schedule 14.11.2017

Я знаю, что это старый вопрос, но я искал то же самое: как получить точечную нотацию из графика в NetworkX?

(Если вас интересует только ответ, пропустите этот абзац. Я действительно хотел отобразить мультиграф NetworkX, но даже если NetworkX - это мощная библиотека Python для управления сетями и графиками, у нее довольно ограниченные возможности при отображении (рендеринге) графиков и сетей. NetworkX использует Matplotlib для предоставления базовых функций для визуализации графиков, которые не имеют вариант для визуализации мультиграфов. NetworkX не предназначен для визуализации графиков, поэтому в документация NetworkX они рекомендуют использовать некоторые инструменты визуализации графиков, Cytoscape, Gephi, Graphviz. У всех этих инструментов есть какие-то интерфейсы Python, но лучший из них (самый простой и простой в использовании) - это graphviz который поддерживает язык DOT в программе для рисования Graphviz. Визуализировать графики в graphviz очень просто и удобно, вы можете использовать одну короткую строку, например graph.view(), которая по умолчанию создает файл PDF и открывает его в программе просмотра PDF по умолчанию вашей системы, но вы также можете просматривать и создавать файлы изображений, такие как SVG и PNG. Поэтому было бы идеально преобразовать граф NetworkX в граф graphviz, и для этого вам нужно преобразовать граф NetworkX в нотацию DOT, которую затем можно прочитать с помощью graphviz.)

Решение Aric простое и работает для распечатки DOT-нотации графика, но это своего рода взлом, а также в моем случае мне нужно сохранить DOT-нотацию в строковой переменной, чтобы я мог использовать ее для создания графика в graphviz из этой записи DOT.

networkx.drawing.nx_pydot.write_dot (источник) - это функция, которая создает формат DOT и сохраняет его в путь (дескриптор файла). Код этой функции:

@open_file(1, mode='w')
def write_dot(G, path):
    P = to_pydot(G)
    path.write(P.to_string())
    return

И это дает нам решение для ответа:

from networkx import path_graph
from networkx.drawing.nx_pydot import to_pydot

G = path_graph(4)
dot = to_pydot(G).to_string()
print(dot)

Функция to_pydot (source) использует pydot, чтобы создать pydot.Dot объект с to_string (source), который возвращает строковое представление графика на языке DOT.

PS: Чтобы отобразить исходный код DOT в graphviz вы можете сделать что-то вроде этого:

from graphviz import Source
src = Source(dot) # dot is string containing DOT notation of graph
src.view()

PPS: два следующих изображения показывают разницу при использовании Matplotlib (левая часть изображения) и graphviz (правая часть изображения) для визуализации графика networkx.margulis_gabber_galil_graph(3):

введите здесь описание изображения

person ands    schedule 16.03.2019