Pygraphviz / networkx establece nivel o capa de nodo

Tengo un conjunto de datos que representa un tipo de árbol genealógico. Cada nodo tiene 2 padres (excepto la primera generación, no tienen padres). Para un nodo dado, sus padres pueden ser de cualquier generación anterior. Por ejemplo, un nodo en la generación n, puede tener un padre en n-1 y otro padre en n-5. Un nodo puede ser padre de varios otros nodos.

Así que básicamente, por cada nodo que conozco su generación y sus padres.

Estoy tratando de representar este gráfico manteniendo los nodos de la misma generación en la misma línea. Cada generación tiene 10 nodos, excepto el primero.

Hasta ahora estoy probando el diseño de “punto”. Cuando solo ingreso dos generaciones, hace un buen trabajo, pero cuando ingreso 3 generaciones, es “demasiado inteligente” y reorganiza los nodos de alguna manera.

Por ejemplo, los siguientes datos, que representan 3 generaciones:

[(OBJECTID ( ‘530b2ad783a1a15e695c9711’), OBJECTID ( ‘530b804883a1a15e695c972b’)), (OBJECTID ( ‘530b2ad783a1a15e695c971c’), OBJECTID ( ‘530b804883a1a15e695c972b’)), (OBJECTID ( ‘530b2ad783a1a15e695c9709’), OBJECTID ( ‘530b804883a1a15e695c9727’)), ( oBJECTID ( ‘530b2ad783a1a15e695c970a’), oBJECTID ( ‘530b804883a1a15e695c9727’)), (oBJECTID ( ‘530b2ad783a1a15e695c970b’), oBJECTID ( ‘530b804883a1a15e695c9724’)), (oBJECTID ( ‘530b2ad783a1a15e695c970f’), oBJECTID ( ‘530b804883a1a15e695c9724’)), (oBJECTID ( , oBJECTID ( ‘530b804883a1a15e695c9729’)), (oBJECTID ( ‘530b2ad783a1a15e695c970e’), oBJECTID ( ‘530b804883a1a15e695c9729’)), (oBJECTID ( ‘530b2ad783a1a15e695c9711’), oBJECTID ( ‘530b804883a1a15e695c9723’)), (oBJECTID ( ‘530b2ad783a1a15e695c970e ‘530b2ad783a1a15e695c9714’) ‘), oBJECTID (‘ 530b804883a1a15e695c9723 ‘)), (oBJECTID (‘ 530b2ad783a1a15e695c971c ‘), oBJECTID (‘ 530b804883a1a15e695c9728 ‘)), (oBJECTID (‘ 530b2ad783a1a15e695c9719 ‘), oBJECTID (‘ 530b804883a1a15e695c9728 ‘)), (oBJECTID (‘ 530b2ad783a1a15e695c9714’ ) , ObjectId (‘530b804883a1a1 5e695c9726 ‘)), (OBJECTID (‘ 530b2ad783a1a15e695c9713 ‘), OBJECTID (‘ 530b804883a1a15e695c9726 ‘)), (OBJECTID (‘ 530b2ad783a1a15e695c9716 ‘), OBJECTID (‘ 530b804883a1a15e695c9722 ‘)), (OBJECTID (‘ 530b2ad783a1a15e695c9719 ‘), OBJECTID (‘ 530b804883a1a15e695c9722’ )), (oBJECTID ( ‘530b2ad783a1a15e695c970d’), oBJECTID ( ‘530b804883a1a15e695c9725’)), (oBJECTID ( ‘530b2ad783a1a15e695c9715’), oBJECTID ( ‘530b804883a1a15e695c9725’)), (oBJECTID ( ‘530b804883a1a15e695c9724’), oBJECTID ( ‘530ba27c83a1a15e695c972d’)) , (oBJECTID ( ‘530b2ad783a1a15e695c9713’), oBJECTID ( ‘530ba27c83a1a15e695c972d’)), (oBJECTID ( ‘530b804883a1a15e695c9724’), oBJECTID ( ‘530ba27c83a1a15e695c972e’)), (oBJECTID ( ‘530b2ad783a1a15e695c9709’), oBJECTID ( ‘530ba27c83a1a15e695c972e’)), ( oBJECTID ( ‘530b804883a1a15e695c9727’), oBJECTID ( ‘530ba27c83a1a15e695c972f’)), (oBJECTID ( ‘530b2ad783a1a15e695c9709’), oBJECTID ( ‘530ba27c83a1a15e695c972f’)), (oBJECTID ( ‘530b2ad783a1a15e695c9713’), oBJECTID ( ‘530ba27c83a1a15e695c9730’)), (oBJECTID ( ‘530b2ad783a1a15e695c9709’, ObjectId (‘ 530ba27c83a1a15e695c9730 ‘)), (OBJECTID (‘ 530b2ad783a1a15e695c9713 ‘), OBJECTID (‘ 530ba27c83a1a15e695c9731 ‘)), (OBJECTID (‘ 530b804883a1a15e695c9725 ‘), OBJECTID (‘ 530ba27c83a1a15e695c9731 ‘)), (OBJECTID (‘ 530b804883a1a15e695c9722 ‘), OBJECTID (‘ 530ba27c83a1a15e695c9732’ )), (oBJECTID ( ‘530b2ad783a1a15e695c970b’), oBJECTID ( ‘530ba27c83a1a15e695c9732’)), (oBJECTID ( ‘530b2ad783a1a15e695c9711’), oBJECTID ( ‘530ba27c83a1a15e695c9733’)), (oBJECTID ( ‘530b2ad783a1a15e695c971f’), oBJECTID ( ‘530ba27c83a1a15e695c9733’)) , (oBJECTID ( ‘530b804883a1a15e695c972b’), oBJECTID ( ‘530ba27c83a1a15e695c9734’)), (oBJECTID ( ‘530b2ad783a1a15e695c9713’), oBJECTID ( ‘530ba27c83a1a15e695c9734’)), (oBJECTID ( ‘530b2ad783a1a15e695c9709’), oBJECTID ( ‘530ba27c83a1a15e695c9735’)), ( oBJECTID ( ‘530b804883a1a15e695c9724’), oBJECTID ( ‘530ba27c83a1a15e695c9735’)), (oBJECTID ( ‘530b2ad783a1a15e695c9713’), oBJECTID ( ‘530ba27c83a1a15e695c9736’)), (oBJECTID ( ‘530b804883a1a15e695c9723’), oBJECTID ( ‘530ba27c83a1a15e695c9736’)), (oBJECTID ( ‘530b2ad783a1a15e695c9716 ‘), OBJECTID (‘ 530b804883a1a15e695c9722 ‘)), (OBJECTID (‘ 530b2ad783a1a15e695c9719 ‘), OBJECTID (‘ 530b804883a1a15e695c9722 ‘)), (OBJECTID (‘ 530b2ad783a1a15e695c9711 ‘), OBJECTID (‘ 530b804883a1a15e695c9723 ‘)), (OBJECTID (‘ 530b2ad783a1a15e695c970e ‘) , oBJECTID ( ‘530b804883a1a15e695c9723’)), (oBJECTID ( ‘530b2ad783a1a15e695c970b’), oBJECTID ( ‘530b804883a1a15e695c9724’)), (oBJECTID ( ‘530b2ad783a1a15e695c970f’), oBJECTID ( ‘530b804883a1a15e695c9724’)), (oBJECTID ( ‘530b2ad783a1a15e695c970d’), oBJECTID ( ‘530b804883a1a15e695c9725’)), (oBJECTID ( ‘530b2ad783a1a15e695c9715’), oBJECTID ( ‘530b804883a1a15e695c9725’)), (oBJECTID ( ‘530b2ad783a1a15e695c9714’), oBJECTID ( ‘530b804883a1a15e695c9726’)), (oBJECTID ( ‘530b2ad783a1a15e695c9713’), oBJECTID (‘ 530b804883a1a15e695c9726 ‘)), (oBJECTID (‘ 530b2ad783a1a15e695c9709 ‘), oBJECTID (‘ 530b804883a1a15e695c9727 ‘)), (oBJECTID (‘ 530b2ad783a1a15e695c970a ‘), oBJECTID (‘ 530b804883a1a15e695c9727 ‘)), (oBJECTID (‘ 530b2ad783a1a15e695c971c ‘), oBJECTID (‘ 530b804883a1a15e695c9728’ )), (ObjectId (‘530b2ad783 a1a15e695c9719 ‘), OBJECTID (‘ 530b804883a1a15e695c9728 ‘)), (OBJECTID (‘ 530b2ad783a1a15e695c9714 ‘), OBJECTID (‘ 530b804883a1a15e695c9729 ‘)), (OBJECTID (‘ 530b2ad783a1a15e695c970e ‘), OBJECTID (‘ 530b804883a1a15e695c9729 ‘)), (OBJECTID (‘ 530b2ad783a1a15e695c9715’ ), oBJECTID ( ‘530b804883a1a15e695c972a’)), (oBJECTID ( ‘530b2ad783a1a15e695c970b’), oBJECTID ( ‘530b804883a1a15e695c972a’)), (oBJECTID ( ‘530b2ad783a1a15e695c9711’), oBJECTID ( ‘530b804883a1a15e695c972b’)), (oBJECTID ( ‘530b2ad783a1a15e695c971c’), ObjectId (‘530b804883a1a15e695c972b’))]

produce: introduzca la descripción de la imagen aquí

Todos los nodos que son “raíz” y, por lo tanto, no reciben un borde deben colocarse en la primera línea, por ejemplo, pero algunos de ellos están en el segundo nivel.

Una vez que trato de hacer gráficos más grandes, con 10 generaciones, toda la jerarquía no tiene ningún sentido.

¿Hay algún parámetro o forma de especificar el nivel o la capa de un nodo? En los datos proporcioné que la información no está allí, pero puedo producirla fácilmente, el problema es que no sé cómo enviar esa información a pygraphviz o networkx.

También quiero usar estos datos para producir gráficos con twopi como este http://networkx.github.io/documentation/latest/examples/drawing/lanl_routes.html

Donde las capas están representadas de forma circular.

Use un subgrafo de Graphviz con atributo rank = igual. p.ej

import networkx as nx import pygraphviz as pgv # pygraphviz should be available G = nx.DiGraph() G.add_edge('a','aa') G.add_edge('a','ab') G.add_edge('a','bbc') G.add_edge('b','ab') G.add_edge('b','bb') G.add_edge('c','bbc') G.add_edge('bb','bba') G.add_edge('bb','bbc') A = nx.to_agraph(G) one = A.add_subgraph(['a','b','c'],rank='same') two = A.add_subgraph(['aa','ab','bb'],rank='same') three = A.add_subgraph(['bba','bbc'],rank='same') A.draw('example.png', prog='dot') 

introduzca la descripción de la imagen aquí

A partir de 2017, la función to_agraph ya no está expuesta en el nx.level . Ahora debes llamar a nx.nx_agraph.to_agraph()