Graphique hiérarchique à bords parallèles

je dois créer un graphique à partir d'un ensemble de données. J'ai passé au crible un nombre incalculable de questions, mais je n'ai pas été en mesure de trouver une solution qui réponde à toutes les exigences essentielles.

Ce qui est nécessaire:

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

Doit-ont des exigences:

  1. placement hiérarchique des noeuds
  2. placement ordonné des noeuds, c. à d. "A" doit être à gauche de " b
  3. bords parallèles entre noeuds
  4. longueur minimale du bord (pour éviter que l'étiquette empiète sur le noeud, comme dans D--E)
  5. solution programmatique, nécessite peu ou pas d'édition de fichier de points pour le résultat souhaité
  6. échelle à quelques milliers de noeuds

exigences très importantes:

  1. lignes droites (ou ortho)
  2. la Tête et la queue des étiquettes
  3. Option pour afficher les pointes de flèche

le graphique peut être non orienté ou dirigé, mais il doit satisfaire aux exigences ci-dessus.

import networkx as 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')

A = 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')

ce qui précède produit: http://i.imgur.com/1e9YTnQ.png

bien sûr, les bords parallèles ne sont pas indiqués avec la méthode ci-dessus. J'ai essayé d'utiliser un Multigraphie qui soutient parallèle les bords mais ne peut pas l'obtenir de travail en raison de l'erreur suivante, malgré la définition de touches uniques pour les bords parallèles (non indiqué dans le code).

Traceback (most recent call last):
  File "example3.py", line 31, in <module>
    A = nx.to_agraph(g)
  File "C:python27libsite-packagesnetworkx-1.11rc1-py2.7.eggnetworkxdrawingnx_agraph.py", line 152, in to_agraph
    A.add_edge(u,v,key=str(key),**str_edgedata)
  File "C:python27libsite-packagespygraphvizagraph.py", line 481, in add_edge
    eh = gv.agedge(self.handle, uh, vh, key, _Action.find)
KeyError: 'agedge: no key'

en utilisant graphviz sans networkx, comme montré ci-dessous, me donne les bords parallèles mais la hiérarchie et l'ordre de noeud est allé. Je sais que la hiérarchie peut être corrigée en ajoutant rank=same au fichier de points mais je préférerais le faire de façon programmatique.

import graphviz as 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')

ne peut pas afficher le lien image pour le dernier rendu à cause de réputation insuffisante.

0
demandé sur TraderMoe 2016-01-24 20:40:36