Я знаю, что это старый вопрос, но я искал то же самое: как получить точечную нотацию из графика в 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)
:
![введите здесь описание изображения](https://i.stack.imgur.com/NRRYS.png)
person
ands
schedule
16.03.2019