В настоящее время networkx
(версия 2.2) не поддерживает вложенные графики, поэтому их легко экспортировать и визуализировать.Попробуйте использовать graphviz для обработки вложенного графика и экспортировать его в формат dot .
Для работы с networkx
версиейgraph, вы можете преобразовать pygraphviz
в networkx
граф и наоборот, сохранив свойство 'graph' для узлов (которое семантически является подграфом), аналогично результату quotient_graph
.
Вот пример преобразования небольшого networkx
графика в pygraphviz
с подграфами и его экспорта в виде dot
файла:
import networkx as nx
import pygraphviz as pgv
G = nx.erdos_renyi_graph(6, 0.5, directed=False)
node_list = [set([0, 1, 2, 3]), set([4, 5])]
pgv_G = pgv.AGraph(directed=True)
pgv_G.add_edges_from(G.edges())
for i, sub_graph in enumerate(node_list):
pgv_G.add_subgraph(sub_graph, name=str(i))
print(pgv_G)
pgv_G.write("test_pgv.dot")
Обратите внимание, что netwrokx
также позволяет писать и читать 'точку'формат (см. пример ), однако, поскольку нет встроенной поддержки для вложенных графиков, это не слишком полезно для этой цели.
Причина, по которой вы не можете написатьquotient_graph
имеет два значения:
- В
quotient_graph
каждый узел имеет свойство 'graph', которое имеет значение SubDiGraph
(или SubGraph
, если исходный граф не является ненаправленным).SubDiGraph
- это ReadOnlyGraph
, что означает, что его невозможно записать с использованием стандартных утилит networkx.readwrite
. - Даже если мы конвертируем
SubDiGraph
в DiGraph
, не каждый файл графикаФормат позволяет закодировать свойство 'graph'.Например, формат graphml поддерживает примитивные свойства, такие как логические значения, целые числа и т. Д. Подробнее здесь .
Одно из работающих решений - решить первую проблему путем переопределения «графа».собственность с DiGraph
копией оригинала SubDiGraph
.Вторая проблема может быть просто решена с помощью другого формата файла (например, формат pickle может работать).Читайте обо всех поддерживаемых форматах здесь .
Ниже приведен рабочий пример:
g_block = nx.quotient_graph(G=G, partition=node_list, relabel=True)
def subdigraph_to_digraph(subdigraph):
G = nx.DiGraph()
G.add_nodes_from(subdigraph.nodes())
G.add_edges_from(subdigraph.edges())
return G
for node in g_block:
g_block.nodes[node]['graph'] = subdigraph_to_digraph(g_block.nodes[node]['graph'])
nx.write_gpickle(g_block, "test_block.pickle")
Это позволяет записывать и загружать вложенный график для использования с netwrokx
, однако для целей использования экспортированного файла в инструменте визуализации это не слишком полезно.