dagre
dagre copied to clipboard
Clustering support
This involves a couple of changes, which we may want to break out into separate tickets:
- Adding subgraph support to the parser
- Making changes to enable cluster layout during the order and positioning phases
Currently investigating this using a few different sources:
- Sander, "Layout of Compound Directed Graphs"
- Forster, "Applying Crossing Reduction Strategies to Layered Compound Graphs"
- Forster, "A Fast and Simple Heuristic for Constrained Two-Level Crossing Reduction"
Is there currently support for a subgraph feature?
Thanks
@aaronkrolik, not yet, unfortunately.
I noticed dig.js had support for subgraphs. Would it be difficult to implement that feature in dagre? I am willing to work on an implementation with a little instruction.
Any work on this? Any possibility of support for subgraphs soon?
+1
+1
+1 for me too! :) This stalled for quite some time due to lack of time on my part, but I have had time over the last week to make some progress on this. There's still a fair amount of work to do, but at least this is getting attention now.
Progress update:
- We can describe clusters with the subgraph feature of graphlib's CGraph and CDigraph.
- I just added support for constrained ordering (#84).
Remaining work: graph preprocessing, graph post-processing, and renderer changes.
Even though I am not I understand the progress in detail, but just to check: will we be able to do stuff like in this link when this issue is closed? http://www.graphviz.org/Gallery/directed/cluster.html
Yes, the goal of this ticket is to be able to group a subgraph in a rectangular area separate from nodes not in the subgraph. Edges can cross subgraph boundaries.
Do you have some informations about the progress of clustering feature?
We have a first pass at clustering on the cluster3 branch. There are a number of edge cases and bugs that need to be addressed before this makes it to master. I've opened tickets and tagged them with "cluster" if they support this goal. Feel free to give the branch a try and if you find issues not already reported in the ticket system, please add them. Also if you're using it and it is working OK for your case that would also be helpful feedback. Thanks!
Just curious if work is continuing on cluster3 — I'd love to have containment, but there are features implemented in the main branch now that I can't live without.
Hi coopermj,
I've been crazy busy again, so I haven't had time to work on it. I'd be happy to help somebody get the clustering branch caught up to master and to address some of the remaining issues on the clustering branch, but I don't have a lot of time to drive it forward myself right now.
+1 It would be awesome if we have this feature.
I was going to open a new Issue - but will hijack this one instead! Firstly I want to thank you for the subgraph/cluster support that is there (once I worked out it even exists!).
Now to the issue (minor) - the subgraph boxes seem to be too wide in certain situations:
And a more extreme example (I think the subgraph is expanding to include some of edge control points?
@GordonSmith that is a known issue and one of the reasons I'm keeping this ticket open. It's actually not a difficult problem to fix; I just need some time to do it. I hope to get it over the upcoming holiday break.
A little more context in case someone wants to take a stab at it before I get to it:
The bk positioner (lib/position/bk.js
) minimizes horizontal space for the graph by shifting blocks of nodes horizontally such that they are close to other nodes while still respecting minimum separation. The positioner doesn't know anything about cluster border nodes, so does not treat them optimally. Instead of keeping them tight to the container clusters nodes, the borders will sometimes expand to the nearest neighbor. I'd like to do another pass to "shrinkwrap" border nodes around their cluster nodes.
If the correct solution is to just calculate the bounds of the contents and add a margin (as a final step) then I might try and have a look at it (I have an ideal spot to do that in my wrapper layers, but that wouldn't be appropriate here...) - BTW very kewl that it is working as well as it is (I am replacing an old ActiveX/NPAPI control which wrapped GraphViz and rendered in c++ - but with chrome dropping NPAPI support this seems to be by far the best option)!!!
Also if anyone is interested, the above "widget" is part of an open source visualization framework I am cobbling together (http://rawgit.com/hpcc-systems/Visualization/master/demos/test.html).
81c5a277d38237961dd2d7739fddfc6451f9726e should fix the issue of having lots of open space in the clusters. I tried it on a few cases, but please give it a go with yours and let me know how it goes. For the moment you'll need to build dagre to try it out - I can paste a version with the fix if that is easier.
This change does not address the wide cluster borders due to edge control points. I need to think about that one a little more. In many cases you want the control points in the cluster, but as in your example above there are exceptions to that guideline!
Why would you want edge control points within a cluster (the only reason I can think of is when the source and target both exist within that cluster)?
Your "fix" seems to be backwards - IOW it seems to use the extra space to spread out the nodes, rather than contracting the cluster?
Before:
After:
Before:
After:
@GordonSmith you also want the control points in the cluster because it keeps the edges straight when they pass through the upper or lower boundary of the cluster. If you force them outside of the cluster then all edges immediately go outside the cluster on the left or right side and then come back in the same way, versus going straight down as they do now. I'm not sure the explanation is clear - if it would help, I could switch it and show you what it looks like.
Regarding the latest version, yes that looks like a step backwards. It would be super helpful if you could get me one of the graphs with a problem in a DOT or JSON format for me to play with.
@cpettitt This is from your graphlib.json.write function:
{
"options": {
"directed": true,
"multigraph": true,
"compound": true
},
"nodes": [
{
"v": "_w478",
"value": "Projected\nCsv Read\n'...::POSITWEETS'",
"parent": "_w949"
},
{
"v": "_w481",
"value": "Projected\nCsv Read\n'...::NEGATWEETS'",
"parent": "_w949"
},
{
"v": "_w484",
"value": "Funnel",
"parent": "_w949"
},
{
"v": "_w487",
"value": "Count Project",
"parent": "_w949"
},
{
"v": "_w490",
"value": "Spill",
"parent": "_w949"
},
{
"v": "_w493",
"value": "Project",
"parent": "_w949"
},
{
"v": "_w496",
"value": "Normalize",
"parent": "_w949"
},
{
"v": "_w499",
"value": "Spill",
"parent": "_w949"
},
{
"v": "_w502",
"value": "Sort",
"parent": "_w949"
},
{
"v": "_w505",
"value": "Group",
"parent": "_w949"
},
{
"v": "_w508",
"value": "Grouped Aggregate",
"parent": "_w949"
},
{
"v": "_w511",
"value": "Group",
"parent": "_w949"
},
{
"v": "_w514",
"value": "Grouped Aggregate",
"parent": "_w949"
},
{
"v": "_w517",
"value": "Spill",
"parent": "_w949"
},
{
"v": "_w520",
"value": "Count",
"parent": "_w949"
},
{
"v": "_w523",
"value": "Store\nInternal('a1')",
"parent": "_w949"
},
{
"v": "_w526",
"value": "Disk Read\nSpill",
"parent": "_w950"
},
{
"v": "_w529",
"value": "Sort",
"parent": "_w950"
},
{
"v": "_w532",
"value": "Count Project",
"parent": "_w950"
},
{
"v": "_w535",
"value": "Disk Write\nSpill File",
"parent": "_w950"
},
{
"v": "_w538",
"value": "Disk Read\nSpill",
"parent": "_w951"
},
{
"v": "_w541",
"value": "Disk Read\nSpill",
"parent": "_w951"
},
{
"v": "_w544",
"value": "Lookup Join",
"parent": "_w951"
},
{
"v": "_w547",
"value": "Disk Read\nSpill",
"parent": "_w951"
},
{
"v": "_w550",
"value": "Sort",
"parent": "_w951"
},
{
"v": "_w553",
"value": "Group",
"parent": "_w951"
},
{
"v": "_w556",
"value": "Disk Read\nSpill",
"parent": "_w951"
},
{
"v": "_w559",
"value": "Sort",
"parent": "_w951"
},
{
"v": "_w562",
"value": "Group",
"parent": "_w951"
},
{
"v": "_w565",
"value": "Join",
"parent": "_w951"
},
{
"v": "_w568",
"value": "If",
"parent": "_w951"
},
{
"v": "_w571",
"value": "Sort",
"parent": "_w951"
},
{
"v": "_w574",
"value": "Group",
"parent": "_w951"
},
{
"v": "_w577",
"value": "Grouped Aggregate",
"parent": "_w951"
},
{
"v": "_w580",
"value": "Project",
"parent": "_w951"
},
{
"v": "_w583",
"value": "Group",
"parent": "_w951"
},
{
"v": "_w586",
"value": "Projected\nDisk Read\nSpill",
"parent": "_w951"
},
{
"v": "_w589",
"value": "Spill",
"parent": "_w951"
},
{
"v": "_w592",
"value": "Sort",
"parent": "_w951"
},
{
"v": "_w595",
"value": "Group",
"parent": "_w951"
},
{
"v": "_w598",
"value": "Join",
"parent": "_w951"
},
{
"v": "_w601",
"value": "Hash Aggregate",
"parent": "_w951"
},
{
"v": "_w604",
"value": "Disk Write\nSpill File",
"parent": "_w951"
},
{
"v": "_w607",
"value": "Disk Grouped Aggregate\nSpill",
"parent": "_w952"
},
{
"v": "_w610",
"value": "Disk Grouped Aggregate\nSpill",
"parent": "_w952"
},
{
"v": "_w613",
"value": "Spill",
"parent": "_w952"
},
{
"v": "_w616",
"value": "All Join",
"parent": "_w952"
},
{
"v": "_w619",
"value": "Projected\nDisk Read\nSpill",
"parent": "_w952"
},
{
"v": "_w622",
"value": "Lookup Join",
"parent": "_w952"
},
{
"v": "_w625",
"value": "Disk Write\nSpill File",
"parent": "_w952"
},
{
"v": "_w628",
"value": "Disk Read\nSpill",
"parent": "_w953"
},
{
"v": "_w631",
"value": "Disk Grouped Aggregate\nSpill",
"parent": "_w953"
},
{
"v": "_w634",
"value": "Lookup Join",
"parent": "_w953"
},
{
"v": "_w637",
"value": "Projected\nDisk Read\nSpill",
"parent": "_w953"
},
{
"v": "_w640",
"value": "Projected\nDisk Read\nSpill",
"parent": "_w953"
},
{
"v": "_w643",
"value": "Group",
"parent": "_w953"
},
{
"v": "_w646",
"value": "Grouped Aggregate",
"parent": "_w953"
},
{
"v": "_w649",
"value": "All Join",
"parent": "_w953"
},
{
"v": "_w652",
"value": "Funnel",
"parent": "_w953"
},
{
"v": "_w655",
"value": "Count Project",
"parent": "_w953"
},
{
"v": "_w658",
"value": "Normalize",
"parent": "_w953"
},
{
"v": "_w661",
"value": "Disk Write\n'~SENTILYZE::TRAINER::BAYESMODEL__p436057190'",
"parent": "_w953"
},
{
"v": "_w948",
"value": "_w948"
},
{
"v": "_w949",
"value": "_w949",
"parent": "_w948"
},
{
"v": "_w950",
"value": "_w950",
"parent": "_w948"
},
{
"v": "_w951",
"value": "_w951",
"parent": "_w948"
},
{
"v": "_w952",
"value": "_w952",
"parent": "_w948"
},
{
"v": "_w953",
"value": "_w953",
"parent": "_w948"
}
],
"edges": [
{
"v": "_w478",
"w": "_w484",
"value": "_w664"
},
{
"v": "_w481",
"w": "_w484",
"value": "_w668"
},
{
"v": "_w484",
"w": "_w487",
"value": "_w672"
},
{
"v": "_w487",
"w": "_w490",
"value": "_w676"
},
{
"v": "_w490",
"w": "_w493",
"value": "_w680"
},
{
"v": "_w493",
"w": "_w496",
"value": "_w684"
},
{
"v": "_w496",
"w": "_w499",
"value": "_w688"
},
{
"v": "_w499",
"w": "_w502",
"value": "_w692"
},
{
"v": "_w502",
"w": "_w505",
"value": "_w696"
},
{
"v": "_w505",
"w": "_w508",
"value": "_w700"
},
{
"v": "_w508",
"w": "_w511",
"value": "_w704"
},
{
"v": "_w511",
"w": "_w514",
"value": "_w708"
},
{
"v": "_w514",
"w": "_w517",
"value": "_w712"
},
{
"v": "_w517",
"w": "_w520",
"value": "_w716"
},
{
"v": "_w520",
"w": "_w523",
"value": "_w720"
},
{
"v": "_w526",
"w": "_w529",
"value": "_w724"
},
{
"v": "_w529",
"w": "_w532",
"value": "_w728"
},
{
"v": "_w532",
"w": "_w535",
"value": "_w732"
},
{
"v": "_w538",
"w": "_w544",
"value": "_w736"
},
{
"v": "_w541",
"w": "_w544",
"value": "_w740"
},
{
"v": "_w547",
"w": "_w550",
"value": "_w744"
},
{
"v": "_w550",
"w": "_w553",
"value": "_w748"
},
{
"v": "_w556",
"w": "_w559",
"value": "_w752"
},
{
"v": "_w559",
"w": "_w562",
"value": "_w756"
},
{
"v": "_w553",
"w": "_w565",
"value": "_w760"
},
{
"v": "_w562",
"w": "_w565",
"value": "_w764"
},
{
"v": "_w544",
"w": "_w568",
"value": "_w768"
},
{
"v": "_w565",
"w": "_w568",
"value": "_w772"
},
{
"v": "_w568",
"w": "_w571",
"value": "_w776"
},
{
"v": "_w571",
"w": "_w574",
"value": "_w780"
},
{
"v": "_w574",
"w": "_w577",
"value": "_w784"
},
{
"v": "_w577",
"w": "_w580",
"value": "_w788"
},
{
"v": "_w580",
"w": "_w583",
"value": "_w792"
},
{
"v": "_w586",
"w": "_w589",
"value": "_w796"
},
{
"v": "_w589",
"w": "_w592",
"value": "_w800"
},
{
"v": "_w592",
"w": "_w595",
"value": "_w804"
},
{
"v": "_w583",
"w": "_w598",
"value": "_w808"
},
{
"v": "_w595",
"w": "_w598",
"value": "_w812"
},
{
"v": "_w598",
"w": "_w601",
"value": "_w816"
},
{
"v": "_w601",
"w": "_w604",
"value": "_w820"
},
{
"v": "_w610",
"w": "_w613",
"value": "_w824"
},
{
"v": "_w607",
"w": "_w616",
"value": "_w828"
},
{
"v": "_w613",
"w": "_w616",
"value": "_w832"
},
{
"v": "_w616",
"w": "_w622",
"value": "_w836"
},
{
"v": "_w619",
"w": "_w622",
"value": "_w840"
},
{
"v": "_w622",
"w": "_w625",
"value": "_w844"
},
{
"v": "_w628",
"w": "_w634",
"value": "_w848"
},
{
"v": "_w631",
"w": "_w634",
"value": "_w852"
},
{
"v": "_w640",
"w": "_w643",
"value": "_w856"
},
{
"v": "_w643",
"w": "_w646",
"value": "_w860"
},
{
"v": "_w637",
"w": "_w649",
"value": "_w864"
},
{
"v": "_w646",
"w": "_w649",
"value": "_w868"
},
{
"v": "_w634",
"w": "_w652",
"value": "_w872"
},
{
"v": "_w649",
"w": "_w652",
"value": "_w876"
},
{
"v": "_w652",
"w": "_w655",
"value": "_w880"
},
{
"v": "_w655",
"w": "_w658",
"value": "_w884"
},
{
"v": "_w658",
"w": "_w661",
"value": "_w888"
},
{
"v": "_w517",
"w": "_w526",
"value": "_w892"
},
{
"v": "_w499",
"w": "_w538",
"value": "_w896"
},
{
"v": "_w535",
"w": "_w541",
"value": "_w900"
},
{
"v": "_w499",
"w": "_w547",
"value": "_w904"
},
{
"v": "_w535",
"w": "_w556",
"value": "_w908"
},
{
"v": "_w523",
"w": "_w568",
"value": "_w912"
},
{
"v": "_w490",
"w": "_w586",
"value": "_w916"
},
{
"v": "_w604",
"w": "_w607",
"value": "_w920"
},
{
"v": "_w589",
"w": "_w610",
"value": "_w924"
},
{
"v": "_w604",
"w": "_w619",
"value": "_w928"
},
{
"v": "_w625",
"w": "_w628",
"value": "_w932"
},
{
"v": "_w625",
"w": "_w631",
"value": "_w936"
},
{
"v": "_w613",
"w": "_w637",
"value": "_w940"
},
{
"v": "_w613",
"w": "_w640",
"value": "_w944"
}
]
}
{
"options": {
"directed": true,
"multigraph": true,
"compound": true
},
"nodes": [
{
"v": "_w1417",
"value": "Disk Count\n'...::VOCABULARY__p2621957508'",
"parent": "_w1871"
},
{
"v": "_w1420",
"value": "Store\nInternal('a2')",
"parent": "_w1871"
},
{
"v": "_w1423",
"value": "Projected\nDisk Read\n'...::BAYESMODEL__p436057190'",
"parent": "_w1872"
},
{
"v": "_w1426",
"value": "Sort",
"parent": "_w1872"
},
{
"v": "_w1429",
"value": "Group",
"parent": "_w1872"
},
{
"v": "_w1432",
"value": "Grouped Aggregate",
"parent": "_w1872"
},
{
"v": "_w1435",
"value": "Project",
"parent": "_w1872"
},
{
"v": "_w1438",
"value": "Group",
"parent": "_w1872"
},
{
"v": "_w1441",
"value": "Projected\nDisk Read\n'...::BAYESMODEL__p436057190'",
"parent": "_w1872"
},
{
"v": "_w1444",
"value": "Sort",
"parent": "_w1872"
},
{
"v": "_w1447",
"value": "Group",
"parent": "_w1872"
},
{
"v": "_w1450",
"value": "Denormalize",
"parent": "_w1872"
},
{
"v": "_w1453",
"value": "Project",
"parent": "_w1872"
},
{
"v": "_w1456",
"value": "Disk Write\nSpill File",
"parent": "_w1872"
},
{
"v": "_w1459",
"value": "Read\nSTORED('t')",
"parent": "_w1873"
},
{
"v": "_w1462",
"value": "Project",
"parent": "_w1873"
},
{
"v": "_w1465",
"value": "Normalize",
"parent": "_w1873"
},
{
"v": "_w1468",
"value": "Disk Write\nSpill File",
"parent": "_w1873"
},
{
"v": "_w1471",
"value": "Disk Read\nSpill",
"parent": "_w1874"
},
{
"v": "_w1474",
"value": "Projected\nDisk Read\n'...::VOCABULARY__p2621957508'",
"parent": "_w1874"
},
{
"v": "_w1477",
"value": "Lookup Join",
"parent": "_w1874"
},
{
"v": "_w1480",
"value": "Disk Read\nSpill",
"parent": "_w1874"
},
{
"v": "_w1483",
"value": "Sort",
"parent": "_w1874"
},
{
"v": "_w1486",
"value": "Group",
"parent": "_w1874"
},
{
"v": "_w1489",
"value": "Projected\nDisk Read\n'...::VOCABULARY__p2621957508'",
"parent": "_w1874"
},
{
"v": "_w1492",
"value": "Sort",
"parent": "_w1874"
},
{
"v": "_w1495",
"value": "Group",
"parent": "_w1874"
},
{
"v": "_w1498",
"value": "Join",
"parent": "_w1874"
},
{
"v": "_w1501",
"value": "If",
"parent": "_w1874"
},
{
"v": "_w1504",
"value": "Sort",
"parent": "_w1874"
},
{
"v": "_w1507",
"value": "Group",
"parent": "_w1874"
},
{
"v": "_w1510",
"value": "Grouped Aggregate",
"parent": "_w1874"
},
{
"v": "_w1513",
"value": "Project",
"parent": "_w1874"
},
{
"v": "_w1516",
"value": "Disk Write\nSpill File",
"parent": "_w1874"
},
{
"v": "_w1519",
"value": "Disk Read\nSpill",
"parent": "_w1875"
},
{
"v": "_w1522",
"value": "Projected\nDisk Read\nSpill",
"parent": "_w1875"
},
{
"v": "_w1525",
"value": "Lookup Join",
"parent": "_w1875"
},
{
"v": "_w1528",
"value": "Sort",
"parent": "_w1875"
},
{
"v": "_w1531",
"value": "Group",
"parent": "_w1875"
},
{
"v": "_w1534",
"value": "Grouped Aggregate",
"parent": "_w1875"
},
{
"v": "_w1537",
"value": "Projected\nDisk Read\nSpill",
"parent": "_w1875"
},
{
"v": "_w1540",
"value": "Sort",
"parent": "_w1875"
},
{
"v": "_w1543",
"value": "Group",
"parent": "_w1875"
},
{
"v": "_w1546",
"value": "Grouped Aggregate",
"parent": "_w1875"
},
{
"v": "_w1549",
"value": "Lookup Join",
"parent": "_w1875"
},
{
"v": "_w1552",
"value": "Filtered\nProjected\nDisk Read\nSpill",
"parent": "_w1875"
},
{
"v": "_w1555",
"value": "Lookup Join",
"parent": "_w1875"
},
{
"v": "_w1558",
"value": "Sort",
"parent": "_w1875"
},
{
"v": "_w1561",
"value": "Dedup",
"parent": "_w1875"
},
{
"v": "_w1564",
"value": "Project",
"parent": "_w1875"
},
{
"v": "_w1567",
"value": "Rollup",
"parent": "_w1875"
},
{
"v": "_w1570",
"value": "Spill",
"parent": "_w1875"
},
{
"v": "_w1573",
"value": "Filtered Project",
"parent": "_w1875"
},
{
"v": "_w1576",
"value": "Output\nInternal('a3')",
"parent": "_w1875"
},
{
"v": "_w1579",
"value": "Filtered\nProjected\nDisk Read\nSpill",
"parent": "_w1876"
},
{
"v": "_w1582",
"value": "Output\nInternal('a4')",
"parent": "_w1876"
},
{
"v": "_w1585",
"value": "Read\nSTORED('t')",
"parent": "_w1877"
},
{
"v": "_w1588",
"value": "Filtered Project",
"parent": "_w1877"
},
{
"v": "_w1591",
"value": "Read\nSTORED('t')",
"parent": "_w1877"
},
{
"v": "_w1594",
"value": "Filtered Project",
"parent": "_w1877"
},
{
"v": "_w1597",
"value": "Funnel",
"parent": "_w1877"
},
{
"v": "_w1600",
"value": "Firstn",
"parent": "_w1877"
},
{
"v": "_w1603",
"value": "Output\nResult #1",
"parent": "_w1877"
},
{
"v": "_w1870",
"value": "_w1870"
},
{
"v": "_w1871",
"value": "_w1871",
"parent": "_w1870"
},
{
"v": "_w1872",
"value": "_w1872",
"parent": "_w1870"
},
{
"v": "_w1873",
"value": "_w1873",
"parent": "_w1870"
},
{
"v": "_w1874",
"value": "_w1874",
"parent": "_w1870"
},
{
"v": "_w1875",
"value": "_w1875",
"parent": "_w1870"
},
{
"v": "_w1876",
"value": "_w1876",
"parent": "_w1870"
},
{
"v": "_w1877",
"value": "_w1877",
"parent": "_w1870"
}
],
"edges": [
{
"v": "_w1417",
"w": "_w1420",
"value": "_w1606"
},
{
"v": "_w1423",
"w": "_w1426",
"value": "_w1610"
},
{
"v": "_w1426",
"w": "_w1429",
"value": "_w1614"
},
{
"v": "_w1429",
"w": "_w1432",
"value": "_w1618"
},
{
"v": "_w1432",
"w": "_w1435",
"value": "_w1622"
},
{
"v": "_w1435",
"w": "_w1438",
"value": "_w1626"
},
{
"v": "_w1441",
"w": "_w1444",
"value": "_w1630"
},
{
"v": "_w1444",
"w": "_w1447",
"value": "_w1634"
},
{
"v": "_w1438",
"w": "_w1450",
"value": "_w1638"
},
{
"v": "_w1447",
"w": "_w1450",
"value": "_w1642"
},
{
"v": "_w1450",
"w": "_w1453",
"value": "_w1646"
},
{
"v": "_w1453",
"w": "_w1456",
"value": "_w1650"
},
{
"v": "_w1459",
"w": "_w1462",
"value": "_w1654"
},
{
"v": "_w1462",
"w": "_w1465",
"value": "_w1658"
},
{
"v": "_w1465",
"w": "_w1468",
"value": "_w1662"
},
{
"v": "_w1471",
"w": "_w1477",
"value": "_w1666"
},
{
"v": "_w1474",
"w": "_w1477",
"value": "_w1670"
},
{
"v": "_w1480",
"w": "_w1483",
"value": "_w1674"
},
{
"v": "_w1483",
"w": "_w1486",
"value": "_w1678"
},
{
"v": "_w1489",
"w": "_w1492",
"value": "_w1682"
},
{
"v": "_w1492",
"w": "_w1495",
"value": "_w1686"
},
{
"v": "_w1486",
"w": "_w1498",
"value": "_w1690"
},
{
"v": "_w1495",
"w": "_w1498",
"value": "_w1694"
},
{
"v": "_w1477",
"w": "_w1501",
"value": "_w1698"
},
{
"v": "_w1498",
"w": "_w1501",
"value": "_w1702"
},
{
"v": "_w1501",
"w": "_w1504",
"value": "_w1706"
},
{
"v": "_w1504",
"w": "_w1507",
"value": "_w1710"
},
{
"v": "_w1507",
"w": "_w1510",
"value": "_w1714"
},
{
"v": "_w1510",
"w": "_w1513",
"value": "_w1718"
},
{
"v": "_w1513",
"w": "_w1516",
"value": "_w1722"
},
{
"v": "_w1519",
"w": "_w1525",
"value": "_w1726"
},
{
"v": "_w1522",
"w": "_w1525",
"value": "_w1730"
},
{
"v": "_w1525",
"w": "_w1528",
"value": "_w1734"
},
{
"v": "_w1528",
"w": "_w1531",
"value": "_w1738"
},
{
"v": "_w1531",
"w": "_w1534",
"value": "_w1742"
},
{
"v": "_w1537",
"w": "_w1540",
"value": "_w1746"
},
{
"v": "_w1540",
"w": "_w1543",
"value": "_w1750"
},
{
"v": "_w1543",
"w": "_w1546",
"value": "_w1754"
},
{
"v": "_w1534",
"w": "_w1549",
"value": "_w1758"
},
{
"v": "_w1546",
"w": "_w1549",
"value": "_w1762"
},
{
"v": "_w1549",
"w": "_w1555",
"value": "_w1766"
},
{
"v": "_w1552",
"w": "_w1555",
"value": "_w1770"
},
{
"v": "_w1555",
"w": "_w1558",
"value": "_w1774"
},
{
"v": "_w1558",
"w": "_w1561",
"value": "_w1778"
},
{
"v": "_w1561",
"w": "_w1564",
"value": "_w1782"
},
{
"v": "_w1564",
"w": "_w1567",
"value": "_w1786"
},
{
"v": "_w1567",
"w": "_w1570",
"value": "_w1790"
},
{
"v": "_w1570",
"w": "_w1573",
"value": "_w1794"
},
{
"v": "_w1573",
"w": "_w1576",
"value": "_w1798"
},
{
"v": "_w1579",
"w": "_w1582",
"value": "_w1802"
},
{
"v": "_w1585",
"w": "_w1588",
"value": "_w1806"
},
{
"v": "_w1591",
"w": "_w1594",
"value": "_w1810"
},
{
"v": "_w1588",
"w": "_w1597",
"value": "_w1814"
},
{
"v": "_w1594",
"w": "_w1597",
"value": "_w1818"
},
{
"v": "_w1597",
"w": "_w1600",
"value": "_w1822"
},
{
"v": "_w1600",
"w": "_w1603",
"value": "_w1826"
},
{
"v": "_w1468",
"w": "_w1471",
"value": "_w1830"
},
{
"v": "_w1468",
"w": "_w1480",
"value": "_w1834"
},
{
"v": "_w1420",
"w": "_w1501",
"value": "_w1838"
},
{
"v": "_w1516",
"w": "_w1519",
"value": "_w1842"
},
{
"v": "_w1456",
"w": "_w1522",
"value": "_w1846"
},
{
"v": "_w1516",
"w": "_w1537",
"value": "_w1850"
},
{
"v": "_w1456",
"w": "_w1552",
"value": "_w1854"
},
{
"v": "_w1570",
"w": "_w1579",
"value": "_w1858"
},
{
"v": "_w1576",
"w": "_w1588",
"value": "_w1862"
},
{
"v": "_w1582",
"w": "_w1594",
"value": "_w1866"
}
]
}
@cpettitt are you planning to add cluster support anytime soon ?
+1
@cpettitt hello, any news about clustering support and linking graphs and subgraphs ?
Hello! I'm very interested in cluster support and noticed this ticket for Dagre D3: https://dagrejs.github.io/project/dagre-d3/latest/demo/clusters.html
Does the same functionality exist in Dagre? I'm not using Dagre D3 for rendering.
Yes, dagre-d3 is using dagre to do the actual layout.