2015-03-09 4 views
0

Я сохраняю график с позициями узлов в формате графа.Импорт графа из графика, восстанавливающего позиции узлов с помощью 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> 

ответ

2

Присвоить х и у значения в словаре с ключами узла

In [1]: pos = {} 

In [2]: for n,data in G.node.items(): 
    ...:  pos[n] = (data['x'],data['y']) 
    ...: 
+0

Это решение принимает простые списки вместо NumPy массивы. Это работает, хотя, так что, я думаю, все в порядке. Любые комментарии, прежде чем я приму свой ответ? – Agostino

+1

Если вам нужны массивы numpy (и здесь нет реальной причины), вы можете просто написать numpy.array (данные ['x'], data ['y']). – Aric

Смежные вопросы