Browse Source

graph: cluster coparents to make parent nodes neighbours

Fabian Peter Hammerle 3 weeks ago
parent
commit
7eae5cafa8
2 changed files with 17 additions and 16 deletions
  1. 7 7
      tests/persons/digraph.dot
  2. 10 9
      yamily/_graphviz.py

+ 7 - 7
tests/persons/digraph.dot

@@ -1,29 +1,29 @@
 digraph yamily {
-	{
+	subgraph "cluster_erika-mustermann" {
 		rank=same
 		"erika-mustermann" [label="Erika Mustermann\n*1957-08-12" shape=box]
-		"thomas-mustermann" [label="thomas-mustermann" shape=box]
 		"relation-erika-mustermann-thomas-mustermann" [shape=point width=0]
 		"erika-mustermann" -> "relation-erika-mustermann-thomas-mustermann" [arrowhead=none constraint=False]
 		"thomas-mustermann" -> "relation-erika-mustermann-thomas-mustermann" [arrowhead=none constraint=False]
+		"thomas-mustermann" [label="thomas-mustermann" shape=box]
 	}
-	{
+	subgraph "cluster_alice-mother" {
 		rank=same
 		"alice-mother" [label="Mum Test" shape=box]
-		"alice-father" [label="alice-father" shape=box]
 		"relation-alice-father-alice-mother" [shape=point width=0]
 		"alice-father" -> "relation-alice-father-alice-mother" [arrowhead=none constraint=False]
 		"alice-mother" -> "relation-alice-father-alice-mother" [arrowhead=none constraint=False]
+		"alice-father" [label="alice-father" shape=box]
 	}
-	{
+	subgraph "cluster_alice-grandmother" {
 		rank=same
 		"alice-grandmother" [label="Grandma Test" shape=box]
 	}
-	{
+	subgraph cluster_alice {
 		rank=same
 		alice [label="Alice Test" shape=box]
 	}
-	{
+	subgraph "cluster_max-mustermann" {
 		rank=same
 		"max-mustermann" [label="Max Mustermann\n*1976-02-01" shape=box]
 	}

+ 10 - 9
yamily/_graphviz.py

@@ -65,27 +65,27 @@ def digraph(collection: PersonCollection) -> graphviz.dot.Digraph:
     >>> graph = digraph(collection)
     >>> print(graph.source)
     digraph yamily {
-    	{
+    	subgraph cluster_grace {
     		rank=same
     		grace [label=grace shape=box]
     	}
-    	{
+    	subgraph cluster_carol {
     		rank=same
     		carol [label=carol shape=box]
-    		bob [label=bob shape=box]
     		"relation-bob-carol" [shape=point width=0]
     		bob -> "relation-bob-carol" [arrowhead=none constraint=False]
     		carol -> "relation-bob-carol" [arrowhead=none constraint=False]
+    		bob [label=bob shape=box]
     	}
-    	{
+    	subgraph cluster_frank {
     		rank=same
     		frank [label=frank shape=box]
     	}
-    	{
+    	subgraph cluster_alice {
     		rank=same
     		alice [label=alice shape=box]
     	}
-    	{
+    	subgraph cluster_david {
     		rank=same
     		david [label=david shape=box]
     	}
@@ -103,17 +103,18 @@ def digraph(collection: PersonCollection) -> graphviz.dot.Digraph:
     for person in collection:
         if person in nodes:
             continue
-        with graph.subgraph() as subgraph:
+        # https://graphviz.gitlab.io/_pages/Gallery/directed/cluster.html
+        with graph.subgraph(name="cluster_" + person.identifier) as subgraph:
             subgraph.attr(rank="same")
             _add_person_node(subgraph, person)
             nodes.add(person)
             for coparent in collection.get_coparents(person):
-                _add_person_node(subgraph, coparent)
-                nodes.add(coparent)
                 parents = tuple(sorted((person, coparent), key=lambda p: p.identifier))
                 parent_node_name = _add_parent_node(subgraph, parents)
                 parent_node_names[parents] = parent_node_name
                 parent_node_names[tuple(parents[::-1])] = parent_node_name
+                _add_person_node(subgraph, coparent)
+                nodes.add(coparent)
     for child in collection:
         if child.mother is not None and child.father is not None:
             parents = sorted(child.parents, key=lambda p: p.identifier)