12
Pydot: http://www.dkbza.org/pydot.html
12
Pydot: http://code.google.com/p/pydot/
13
13
Graphviz: http://www.research.att.com/sw/tools/graphviz/
14
14
DOT Language: http://www.graphviz.org/doc/info/lang.html
18
__author__ = """Aric Hagberg (hagberg@lanl.gov)"""
19
# Copyright (C) 2004-2008 by
16
# Copyright (C) 2004-2011 by
20
17
# Aric Hagberg <hagberg@lanl.gov>
21
18
# Dan Schult <dschult@colgate.edu>
22
19
# Pieter Swart <swart@lanl.gov>
23
20
# All rights reserved.
22
from networkx.utils import open_file, make_str
24
__author__ = """Aric Hagberg (hagberg@lanl.gov)"""
26
25
__all__ = ['write_dot', 'read_dot', 'graphviz_layout', 'pydot_layout',
27
26
'to_pydot', 'from_pydot']
30
from networkx.utils import _get_fh
28
@open_file(1,mode='w')
34
29
def write_dot(G,path):
35
30
"""Write NetworkX graph G to Graphviz dot format on path.
41
36
except ImportError:
42
raise ImportError("write_dot() requires pydot http://dkbza.org/pydot.html/")
37
raise ImportError("write_dot() requires pydot",
38
"http://code.google.com/p/pydot/")
45
fh.write(P.to_string())
46
fh.flush() # might be a user filehandle so leave open (but flush)
40
path.write(P.to_string())
43
@open_file(0,mode='r')
49
44
def read_dot(path):
50
45
"""Return a NetworkX MultiGraph or MultiDiGraph from a dot file on path.
135
126
# add default attributes for graph, nodes, edges
136
127
N.graph['graph']=P.get_attributes()
137
# get atributes not working for these?
138
# get_node_defaults()
140
if 'node' in P.obj_dict['nodes']:
141
N.graph['node']=P.obj_dict['nodes']['node'][0]['attributes']
142
# get_edge_defaults()
144
if 'edge' in P.obj_dict['nodes']:
145
N.graph['edge']=P.obj_dict['nodes']['edge'][0]['attributes']
146
N.node_attr=node_attr
129
N.graph['node']=P.get_node_defaults()[0]
130
except:# IndexError,TypeError:
133
N.graph['edge']=P.get_edge_defaults()[0]
134
except:# IndexError,TypeError:
150
138
def to_pydot(N, strict=True):
177
165
graph_type='graph'
178
166
strict=N.number_of_selfloops()==0 and not N.is_multigraph()
180
P = pydot.Dot(graph_type=graph_type,strict=strict)
168
name = N.graph.get('name')
169
graph_defaults=N.graph.get('graph',{})
171
P = pydot.Dot(graph_type=graph_type,strict=strict,**graph_defaults)
173
P = pydot.Dot('"%s"'%name,graph_type=graph_type,strict=strict,
176
P.set_node_defaults(**N.graph['node'])
180
P.set_edge_defaults(**N.graph['edge'])
182
184
for n,nodedata in N.nodes_iter(data=True):
183
str_nodedata=dict((k,str(v)) for k,v in nodedata.items())
184
p=pydot.Node(str(n),**str_nodedata)
185
str_nodedata=dict((k,make_str(v)) for k,v in nodedata.items())
186
p=pydot.Node(make_str(n),**str_nodedata)
187
189
if N.is_multigraph():
188
190
for u,v,key,edgedata in N.edges_iter(data=True,keys=True):
189
str_edgedata=dict((k,str(v)) for k,v in edgedata.items())
190
edge=pydot.Edge(str(u),str(v),key=str(key),**str_edgedata)
191
str_edgedata=dict((k,make_str(v)) for k,v in edgedata.items())
192
edge=pydot.Edge(make_str(u),make_str(v),key=make_str(key),**str_edgedata)
194
196
for u,v,edgedata in N.edges_iter(data=True):
195
str_edgedata=dict((k,str(v)) for k,v in edgedata.items())
196
edge=pydot.Edge(str(u),str(v),**str_edgedata)
197
str_edgedata=dict((k,make_str(v)) for k,v in edgedata.items())
198
edge=pydot.Edge(make_str(u),make_str(v),**str_edgedata)
200
P.obj_dict['attributes'].update(N.graph.get('graph',{}))
204
P.obj_dict['nodes']['node'][0]['attributes'].update(N.graph.get('node',{}))
208
P.obj_dict['nodes']['edge'][0]['attributes'].update(N.graph.get('edge',{}))
261
250
except ImportError:
262
raise ImportError("pydot_layout() requires pydot http://dkbza.org/pydot.html/")
251
raise ImportError('pydot_layout() requires pydot ',
252
'http://code.google.com/p/pydot/')
265
255
if root is not None :
266
P.set("root",str(root))
256
P.set("root",make_str(root))
268
258
D=P.create_dot(prog=prog)