python - Hierarchical graph with parallel edges -


i need create graph set of data. have sifted through countless questions not been able find solution fits must-have requirements.

what's needed:

http://i.imgur.com/hzqhd07.png

must-have requirements:

  1. hierarchical placement of nodes
  2. ordered placement of nodes, i.e. 'a' should left of 'b'
  3. parallel edges between nodes
  4. minimum length of edge (to avoid label encroaching upon node, in d--e)
  5. programmatic solution, requires little no editing of dot file desired result
  6. scale few thousand nodes

very-important requirements:

  1. straight lines (or ortho)
  2. head , tail labels
  3. option display arrowheads

the graph undirected or directed should meet above requirements.

import networkx nx g = nx.graph()  g.add_edge(node1,node3,headlabel='label 2', taillabel='label 1',fontsize='10') g.add_edge(node1,node4,headlabel='label 4', taillabel='label 3',fontsize='10') g.add_edge(node2,node5,headlabel='label 6', taillabel='label 5',fontsize='10') g.add_edge(node2,node6,headlabel='label 8', taillabel='label 7',fontsize='10') g.add_edge(node4,node5,headlabel='really long label', taillabel='really long label',fontsize='10') g.add_edge(node4,node5) g.add_edge(node3,node7) g.add_edge(node7,node8) g.add_edge(node7,node8) g.add_edge(node4,node8) g.add_edge(node5,node8) g.add_edge(node5,node9,headlabel='label 12', taillabel='label 11',fontsize='10') g.add_edge(node6,node9,headlabel='label 10', taillabel='label 9',fontsize='10')  = nx.to_agraph(g) a.add_subgraph([node1,node2],rank='same') a.add_subgraph([node3,node4,node5,node6],rank='same') a.add_subgraph([node7,node8,node9],rank='same') a.draw('example2.png', prog='dot') 

the above produces: http://i.imgur.com/1e9ytnq.png

of course parallel edges not shown above method. tried using multidigraph supports parallel edges can't work due following error, despite defining unique keys parallel edges (not shown in code).

traceback (most recent call last):   file "example3.py", line 31, in <module>     = nx.to_agraph(g)   file "c:\python27\lib\site-packages\networkx-1.11rc1-py2.7.egg\networkx\drawing\nx_agraph.py", line 152, in to_agraph     a.add_edge(u,v,key=str(key),**str_edgedata)   file "c:\python27\lib\site-packages\pygraphviz\agraph.py", line 481, in add_edge     eh = gv.agedge(self.handle, uh, vh, key, _action.find) keyerror: 'agedge: no key' 

using graphviz without networkx, shown below, gives me parallel edges hierarchy , node ordering gone. know hierarchy can fixed adding rank=same dot file i'd prefer programmatically.

import graphviz gv g = gv.graph(format='png')  g.edge(node1,node3,headlabel='label 2', taillabel='label 1',fontsize='10') g.edge(node1,node4,headlabel='label 4', taillabel='label 3',fontsize='10') g.edge(node2,node5,headlabel='label 6', taillabel='label 5',fontsize='10') g.edge(node2,node6,headlabel='label 8', taillabel='label 7',fontsize='10') g.edge(node4,node5,headlabel='really long label', taillabel='really long label',fontsize='10') g.edge(node4,node5) g.edge(node3,node7) g.edge(node7,node8) g.edge(node7,node8) g.edge(node4,node8) g.edge(node5,node8) g.edge(node5,node9,headlabel='label 12', taillabel='label 11',fontsize='10') g.edge(node6,node9,headlabel='label 10', taillabel='label 9',fontsize='10')  g.render('example') 

can't post image link last rendering because of insufficient reputation.


Comments