elk icon indicating copy to clipboard operation
elk copied to clipboard

Layered strategy with 'collapsed' nodes and root node on the top left position

Open eugenehuangsg opened this issue 1 year ago • 11 comments

Hi guys, I'm trying to design a 5 columns layout with the following constraints

  • There is always only one root node, and it should be positioned on the top-left
  • Some nodes can be collapsed (children nodes hidden from the layout), but their ordering relative to their siblings nodes should always be maintained

Expected outcome image

So far, I'm able to get the expected layout when the graph is fully expanded. However, the graph starts to differ from my intended outcome whenever some nodes are collapsed. I suspect it is due to crossingMinimization options but I have no idea how to fix it. I would appreciate any guidance on this.

Current options: { 'elk.algorithm': 'layered', 'elk.direction': 'RIGHT', 'elk.spacing.nodeNode': 20, 'elk.spacing.edgeEdge': 10, 'elk.layered.spacing.nodeNodeBetweenLayers': 100, 'elk.layered.crossingMinimization.forceNodeModelOrder': true, 'elk.layered.nodePlacement.favorStraightEdges': true, 'elk.layered.layering.strategy': 'BRANDES_KOEPF', 'elk.layered.layered.nodePlacement.bk.fixedAlignment': 'LEFTUP' }

Unintended outcome when nodes are hidden.

  • The 'Mannings' node should ideally be fixed on the (0, 0) position
  • This happens when the "Food" node has been collapsed image

eugenehuangsg avatar Apr 05 '24 11:04 eugenehuangsg

Please recreate your problem in elklive so that we can help you.

Eddykasp avatar Apr 05 '24 11:04 Eddykasp

@Eddykasp Thank you for getting back promptly. Here is the link to the model

https://rtsys.informatik.uni-kiel.de/elklive/elkgraph.html?compressedContent=IYGw5g9gTglgLgCwLYC4AEJgE8CmUcAmAUDiANYB0BM+AxnDBAHboBKAkgOIASAKkQGcADsFowmYCkwgEcAORk50AJgAMgkWIkVCYHAFECelesy58BCsNHjJ02QtkAhHHADuOHEwAy2PAPQARlVTPwsKWigIAQFbAFlxGCQYAC9gBmYKADNoWnlFOMUQAHkoWSh0OCgAVxwiMzxCKUUABUw8pC84bOAAN2gAZSrgGDAEOEM9ALQq2qJ7HDbRHE6mboFhuBwwLHQnVgBBOQARfQGAfQBpYv0WgDF51vaVrooAI0osmAAPQgOQUZMVZwdByYpyfRER6yNBMQJoADeRDQKIwwDepDQACIkFiiABfaE4WHKRHI1GYDEgbE5GR4wkLWEAZjJqLRVOxBFgTDI9KJsIALGh+UwAKwigBsIoA7CKABwigCcIuCrIp6MxWNkMTwcD5jLhgRVyhVTJVApV4pIRmJcLQAFoAHwkqEAeldaAAqkxaBAkMCZggYAI0DkoGgcN8hDh6IQ0EJovBGExbER3RGbSSHc6mBb07pbaSnbDxfnM0wizmpda9LD4cWmGaC3Xs3X1M3G62mLKOyyGwre13lR25V3AhaR2PxR3VQ3AkaZ6oxybF2OmUA

eugenehuangsg avatar Apr 05 '24 15:04 eugenehuangsg

Does this solve your problem?

If any questions remain, please do not hesitate to ask.

soerendomroes avatar Apr 08 '24 06:04 soerendomroes

Thank you for the insight. The NETWORK_SIMPLEX + priority.straightness is a possible approach. I'm trying to figure out how to programmatically allocate straightness priority to get the desired look and feel. Naively, the edges represent the weight among its sibling edges, but there is a relevance where the priority of other sections of the graph can still influence. Can you help weigh in on this?

https://rtsys.informatik.uni-kiel.de/elklive/elkgraph.html?compressedContent=IYGw5g9gTglgLgCwLYC4AEJgE8CmUcAmAUDiANYB0BM+AxnDBAHboBKAkgOIASAKkQGcADsFowmYCkwgEcAORk50AJgAMgkWIkVCYHAFECe9AEZ1mXPgIVho8ZOmyFsgEI44Adxw4mAGWx4Aqaq6kQA9GEYAVYUtFAQAgL2ALLiMEgwAF7ADMwUAGbQtPKKyYogAPJQslDocFAArjhEFniEsfGJKWkZ2blMNvU5OGBY6HIVcvpoEWjs+WhYEA1QaGBQwEIIaDACaMBo9d6Ly2hI2PsAbhAwBGhxCUkSZz1ZOYxMaBTf4ZHr3gQsABlDzwWgIChwLBCJRoCoAMXhM0i3woOyYAjgOGAdwgC0QODQhSgxTQjkJ0BqaExDXy+SIRHJAAVMMUkD44IMNljRuN9LwAOoVVgAaQA+kD2Mkmb59AANBmzIEMEAgMkQOCHCAQe4gbGrDwIHI7PaIXbUhpCIQJQhatAECAUX7UnAibk4ADCzCYOHohC9SGtPqYcCCRNAAkJs14CEJiHwhMjbuGaAARhAAB44PbAfCHX0IJgwWigEBYF3JrFrDZbARogXwbZmvZeIlFOOxpB21OEt2avGHWPU4DsqJLBpwBnk+4mEyMxT3ZQmNAAbyIaA3UR7aoARLQlzuiABfeeyRfKU+E-cAZlX683mG3aD3ymvh5P0-3ABY75ut6Rn2-d9L0XABWED9wANgg5QAHYYIADgg69lzXP9HwAvcUOAz9rwvXDbzQh9gCfLC32PZCv2Q8DcOg3DYN-YjSNoa9YJwhcWKQ3CAE5GI3DDdxY7j2LPFixTMPj-0E69xNUESrxk2dJIEwDFJMeT7i-VD734kjMNoLSNIM-COK-a8IK-KjPy-GjTLo0z4JIIwryUgBaAA+RdtL-IRYGgeAsC5YAYDABA4B9RJ0Hgk9dBc5cPPPSTfMYWAoSCkKwoisN1Bi5yZ3izzvycvR8rQBL93A2LSvK5RoKq2g3MKuDirisqmqQ+rGsXcyWq8tr7hQ5TonaZL-LSzENgy8LszDbiKPqpd+pYi8FuUJbr0InSxzaaxRtSwKJuC0LpsitAqNykr9zW8rryo1b1sqvKrvWuqntfdaGKI3TLBGvz9vS46svQW9Zm4CAPHuYBPhge08BgS4O3NXyIHWEdzgYEtVXLAQGnBQdjXgNBQVVNAfBxvNDqm0nnPmt7bxujq6fWuaFvpwrFPUBafxu8TvOIn7dr+gKAcymaouROEmDLNAGI8aAyAECjepYtnNL576dooPbhcpwGxbQSCJZjRMhimrL9itfU9hAGAyEJA4vCm4ASvyUQ4GgAAaInYzzH8obuUC0CNPYBAgUccDpX1QzTCd1U1HxllC2nLo2pavxWp7U-KszlazwrLNz1WDMelOi6-V7S7T2CgA

eugenehuangsg avatar Apr 09 '24 04:04 eugenehuangsg

If nodes have only connections to the right without skipping a layer and the order of nodes is fix and the order of edges corresponds to the order of nodes, the outgoing edge has to be straight and needs a straightness priority. Everything else does not need one, hence you can just set priority.straightness: 10 or something like this on every node if you can keep the edge and node order as it is. Since you set crossingMinimization.strategy to NONE this is what you have to do anyway to avoid crossings.

soerendomroes avatar Apr 09 '24 06:04 soerendomroes

My bad, you only need to take care that the edges are ordered as you want them to be. The nodes are ordered by the edges.

soerendomroes avatar Apr 09 '24 06:04 soerendomroes

Somehow, setting crossMinimization.strategy to NONE does not take effect in the JSON format. Can you help me take a look?

JSON format https://rtsys.informatik.uni-kiel.de/elklive/json.html?compressedContent=N4KABGCWAmBcYCIBOB7FAXBAacYA2AhgJ4oCu6A8gA7qQoB2AzvMGLhAOQF4DmKSkdAAsAth3gdCRAKZJp0DjgidpeANYA6aJDkBjWg3FgOAJQCSAcQASAFUXtjqzYyoFdkejw30U0aQDlfaSMAJgAGJWUOJw0XNw8veR5pAFFoZKMARgiHaPUNKVl5WNd3T28gwL8AIWl0AHdpaXoAGWJZRiywnNzCuWgKvwAFQl1pEWb0WPQkAnRpHiIjDn8UmwB1ChMAaQB9AGUzAFkhlpSADXsHAHprsBTBIVkwFAAzMGFpRmkwKlQqWS0L5gaAoYE+dAfAhqH7SV6vaT6MD1J70MBmMCkb4fJ4iG53STtfoaXSoRiMBJHDyQESQABeczo9Gms3mi2W-goq0UbGUYFuxj6xVJKHJlOptIZBmZr34Yyq0iOQTwFCQfiQRhmpGk+MFROFDAp6qVfhVatkLLmCyWEk5ABEUvtdgBBfx23YpO0WR0cXAAX0iuiEkDw0Dk9HgAG0HKwYPAEPRMthkTBhPAAMwRMBPSA8IToDNZwgAI1UzDAkeA8wAHgXjImOH6ALpgAMxqBwRD0ELJ+qpoSFrDZ6S5-OD-AEUt4cuVmt1jjdxsttt82OdhPp3v98c5vN1zNDktlqNV6S1iT0dNL1uRCBr+P0AAsW+gabAB+Ho-3Rcnx4rp-PetH2vP1cCbSIki+KN2zjRBpCTIdGDIJAxhnLskzAcCoSQZJ0DQhMe0wldlHvOCe0Q5DUKjdCEEwod0AIHC6nwy9aKbYi7w7eNpE3CjSBQqCKxoujsNwljnyIsCQD9IA

Text format https://rtsys.informatik.uni-kiel.de/elklive/elkgraph.html?compressedContent=IYGw5g9gTglgLgCwLYC4AEJgE8CmUcAmAUDiANYB0BM+AxnDBAHboBKAkgOIASAKkQGcADsFowmYCkwgEcAORk50AJgAMgkWIkVCYHAFECe9AEZ1mXPgIVho8ZOmyFsgEI44Adxw4mAGWx4Aqaq6kSOOAAKmLQ4SD5wNnBQwHA4YFjocvq8AOoA8qwA0gD6AMrsALIRvvoAGkREAPSNGAFWFLRQEAIC9hXiMEgwAF4pjEyJyanpmXlZTS0WeIQdXT19A0OjDMwUAGbQMc44FYogeVCyUOhJAK44C62WK7TMvVensueXeJMpaRk0HI8gARfSlYoAQTkIOK+hBnHBDXCaCYJjQAG8iGgca0AEakNAAcjRRKIAF8wopUcpMdjcZgCSBiUxlGTKSimABmOm4-GEklc9lU2SogAsvIZwCZLLFwpIRhwqPRAFoAHw0hV6ZVodWorlapVo3UaphioA

eugenehuangsg avatar Apr 10 '24 12:04 eugenehuangsg

You have to change the ELK version to 0.8.X or higher.

soerendomroes avatar Apr 10 '24 13:04 soerendomroes

Cool, all my issues have been solved. Thank you for the help!

Here is the final solution for those who might need it.

https://rtsys.informatik.uni-kiel.de/elklive/elkgraph.html?compressedContent=IYGw5g9gTglgLgCwLYC4AEJgE8CmUcAmAUDiANYB0ADsAQTAHZjoBEA2nBFQLwAsAbABoMOAGZxuAJgAMAXRYlyFevgDGcGBAboASgEkA4gAkAKkQDONVYzAUGEAjgByDnOgCs0i1ZsVCYHABRAgD0AEYvTFx8AgpLYGsmO1cXRwAhHDgAdxwcBgAZbDxzcOkvIii8QmTHAAVMVRwkPLg4uChgOBwwLHQnQJMAdQB5HQBpAH0AZT0AWVr8wIANIlUoCHNzG1nGGCQYAC9OzQY2jq6evuH+oiJ7RzRVMLC710fJMLQAbyI0P4xgAAjUhoFiqD4KAC+rwe4MkMJw7wAzN9fv9MMCQKDwUioQj3rxUf8AZjsZJeHj7ojwe58eD+HTJAB2RkADjpSM+P2JGJBYM5lLeqiR8KpjyRKO56KBfOFuKI0LFwt4HNpSqRDPVTKJ0tJ-KZgthSPZ6oAnDq-rysfzTYbqUiJhELSTZQ6InbxY6uWjLTLrcKvR7VLxvTy-diQ0HeKKhbwkXTeCqlbw1bHNbGWcn2UQAPQ5tCSVloKnmNCMNCcOCgEghanPNAAWgAfO9Q-8qLBoPAsGdgDAwAg4AwcJt0IWFTWAo96833pI0JO659ZzjF9Ply3wSr-EvG5vJLSd+u9+8GUenhv3izzzP99nzx8T8K238O5pYHAe+Z2n2B0ORyUBbstCD6XsK8IPvOK4Ss6b5dp+vb9oOw6jkBE6QU+SLbrWc6YYeOFwphZ4EZIKLQdqUqvp2H5fj+SH-qh44gSRZGbsaa44phpocaRmGOl4D6EtBXq3OeMEriGsHUd2iF-ihgFMRx4mbtGSmsY8cZqU+iZaRJ+FTnK2nEQZykadeBFumBvCskAA

eugenehuangsg avatar Apr 11 '24 00:04 eugenehuangsg

Hi @soerendomroes, is there a property I can set to force the position of the root node on the top left corner?

With straightness priority, the root node can potentially still move with the graph.

https://rtsys.informatik.uni-kiel.de/elklive/elkgraph.html?compressedContent=IYGw5g9gTglgLgCwLYC4AEJgE8CmUcAmAUDiANYB0BM+AxnDBAHboBKAkgOIASAKkQGcADsFowmYCkwgEcAORk50AJgAMgkWIkVCYHAFECe9AEZ1mXPgIVho8ZOmyFsgEI44Adxw4mAGWx4Aqaq6kQA9GEYAVYUtFAQAgL2ALLiMEgwAF7ADMwUAGbQtPKKyYogAPJQslDocFAArjhEFniEsfGJKWkZ2blMNvU5OGBY6HIVcvpoEWjs+WhYEA1QaGBQwEIIaDACaMBo9d6Ly2hI2PsAbhAwBGhxCUkSZz1ZOYxMaBTf4ZHr3gQsABlDzwWgIChwLBCJRoCoAMXhM0i3woOyYAjgOGAdwgC0QODQhSgxTQjkJ0BqaExDXy+SIRHJAAVMMUkD44IMNljRuN9LwAOoVVgAaQA+kD2Mkmb59AANBmzAQ4ETcnAAYWYTBw9EImqQQmYHKCRNAyuRaF4CEJiHwhOVquGaAARhAAB44PbAfCHHUIJgwWigEBYakq71O9abBACNEC+DbRC7NBeIlFG3WpCHCAuwmquBoPGHa3U4DsqJLBpwQThtWapja3UEfWG7VMOAm-Jm5qMxT3EwmNAAbyIaDHUWdpDQACJaAPp0QAL692T3ZSDkfjidT2frhfL8lr5Qrwm0ZQAZmHo-HmEnIBnZ-P+5Pa4ALFet7ed2fX8-D2eAFYXzPAA2YDlAAdnAgAOYDzw3a8xy-e9Z3gv8+1oc9j3-c9L03G9gDvB9cPQ1dMNfOCgJwsCcIgj8CKI1CINI09z1gnCAE56KQwjv3PDiWPuc8xTMbjtxQzCRNUQTJIHMTkOIkSTBk18EM-XiJNUlTsIw19z2A18KP-V8qN0mjdKg340AAVSYWgICQdl2zTVY50HOAcyQCBLhtHMCWzIQAFoQBwfIC0NJJ+is3RTzkwKAD41wQ2YtyEWBoHgLAuWAGAwAQOBtUSdAoNmZcYv7QcEqPMS0sYWAoWy3L8sKk11DKoxYsqxKfxIDqKrQKrAN6vR+sG5QwPKtyBu6yDhs66a11gya4pm-S5qShbMLUgjLHaWqMoazENiagrPRNDil3Ws8uqE49JuUZRNtw+Toj29L6qyo6cry06irQCj2pGs9HsG88KPukHuvPICIaeia+sfJ66PwnjdusfaPsan6WvQS9Zm4CAPHuYBPhgNAahgHzi2TNKICjRz3iDEAQ2pBpwWLHIdgLUFmbQHwBBWe0hhOvmOsu+7L1BpaEYvJ6Lolp6pKu5R31BpSXrRigMcyrHmrO4qLQqJgWbojxoDIARLqu57BtUjW2nR96da+k6cbQECLStIXjuxs79iEGFvT2EAYDIQkDi8E7gBGrt6GgAAaFNrR9d8SbuAC0AQYA9gEBzCVC-IdQ7F0qzJCACx8ZY8vFhGbe6187tryX6-0ya6-uQzrebjuYabzbX3hoH29oV8IKAA

eugenehuangsg avatar Apr 18 '24 17:04 eugenehuangsg

No, sadly not.

soerendomroes avatar Apr 18 '24 18:04 soerendomroes