Я сохраняю график с позициями узлов в формате графа.Импорт графа из графика, восстанавливающего позиции узлов с помощью NetworkX
Я хочу загрузить его и нарисовать его узлы в тех же положениях, что и раньше. Данные, сохраненные в файле graphml, состоят из примитивных типов, тогда как данные, используемые mathplotlib
для рисования графика, представляют собой словарь {string: array([x, y]), dtype=float32}
, где array
, скорее всего, является массивом numpy
.
Я использую NetworkX 1.9.1, и это мой код. Я думаю, проблема может быть вызвана грязной итерацией. Кроме того, я не могу построить с нуля структуру, используемую для рисования позиций.
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
#load the graph from the graphml file
def load_graph(file_path):
G = nx.read_graphml(file_path)
return G
def show_graph(G):
#used to create the structure, computation useless
pos = nx.circular_layout(G)
print(pos)
#try to refill the structure (don't produce expected results)
for (node, node_pos) in pos.items():
node_pos[0] = G.node[node]['x']
node_pos[1] = G.node[node]['y']
#draw the graph
print(pos)
plt.clf()
nx.draw_networkx(G, pos)
plt.show()
file_path = 'netw_a.graphml'
A = load_graph(file_path)
show_graph(A)
Вот тестовый файл для импорта
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<key attr.name="x" attr.type="double" for="node" id="d2" />
<key attr.name="y" attr.type="double" for="node" id="d1" />
<key attr.name="name" attr.type="string" for="graph" id="d0" />
<graph edgedefault="undirected">
<data key="d0">path_graph(4)</data>
<node id="0">
<data key="d1">0.394087123189</data>
<data key="d2">0.0</data>
</node>
<node id="1">
<data key="d1">0.743297296307</data>
<data key="d2">0.402465740641</data>
</node>
<node id="2">
<data key="d1">0.529781867707</data>
<data key="d2">0.942892202945</data>
</node>
<node id="3">
<data key="d1">0.0</data>
<data key="d2">1.0</data>
</node>
<edge source="0" target="1" />
<edge source="1" target="2" />
<edge source="2" target="3" />
</graph>
</graphml>
Это решение принимает простые списки вместо NumPy массивы. Это работает, хотя, так что, я думаю, все в порядке. Любые комментарии, прежде чем я приму свой ответ? – Agostino
Если вам нужны массивы numpy (и здесь нет реальной причины), вы можете просто написать numpy.array (данные ['x'], data ['y']). – Aric