1

I'm using NetworkX 1.9.1.

I have a graph that I need to organize with positions and I then export to graphml format.

I've tried code in this question. It does not work, here is my example

import networkx as nx
import matplotlib.pyplot as plt

G = nx.read_graphml("colored.graphml")

pos=nx.spring_layout(G) # an example of quick positioning
nx.set_node_attributes(G, 'pos', pos)

nx.write_graphml(G, "g.graphml")

nx.draw_networkx(G, pos)
plt.savefig("g.pdf")

Here are the errors I get, the problem is how positions are saved (graphml does not accept arrays).

C:\Anaconda\python.exe C:/Users/sturaroa/Documents/PycharmProjects/node_labeling_test.py
Traceback (most recent call last):
  File "C:/Users/sturaroa/Documents/PycharmProjects/node_labeling_test.py", line 11, in <module>
    nx.write_graphml(G, "g.graphml")
  File "<string>", line 2, in write_graphml
  File "C:\Anaconda\lib\site-packages\networkx\utils\decorators.py", line 220, in _open_file
    result = func(*new_args, **kwargs)
  File "C:\Anaconda\lib\site-packages\networkx\readwrite\graphml.py", line 82, in write_graphml
    writer.add_graph_element(G)
  File "C:\Anaconda\lib\site-packages\networkx\readwrite\graphml.py", line 350, in add_graph_element
    self.add_nodes(G,graph_element)
  File "C:\Anaconda\lib\site-packages\networkx\readwrite\graphml.py", line 307, in add_nodes
    self.add_attributes("node", node_element, data, default)
  File "C:\Anaconda\lib\site-packages\networkx\readwrite\graphml.py", line 300, in add_attributes
    scope=scope, default=default_value)
  File "C:\Anaconda\lib\site-packages\networkx\readwrite\graphml.py", line 288, in add_data
    '%s as data values.'%element_type)
networkx.exception.NetworkXError: GraphML writer does not support <type 'numpy.ndarray'> as data values.

I'm under the impression that I would be better off defining positions as 2 separate node attributes, x and y, and save them separately, defining a key for each of them in the graphml format, like this.

However, I'm not that familiar with Python, and would like your opinion before I make a mess iterating back and forth.

Thanks.

Community
  • 1
  • 1
Agostino
  • 2,723
  • 9
  • 48
  • 65

1 Answers1

5

You are right, GraphML want's simpler attributes (no numpy arrays or lists).

You can set the x and y positions of the nodes as attributes like this

G = nx.path_graph(4)
pos = nx.spring_layout(G)

for node,(x,y) in pos.items():
    G.node[node]['x'] = float(x)
    G.node[node]['y'] = float(y)

nx.write_graphml(G, "g.graphml")
Aric
  • 24,511
  • 5
  • 78
  • 77
  • Would you helping me with the code to import the graph back from the graphml and extract a set of positions suitable for drawing? I opened [a question](http://stackoverflow.com/q/28952565). Thanks. – Agostino Mar 09 '15 at 22:03