dagre
dagre copied to clipboard
Unable to draw an edge from a child to parent compound graph
Hi all,
I am currently using Dagre for one of my data visualisation project, it is a compound graph which requires a node to contain a nested node, I'm unable to draw edges from child nodes to parent nodes, I get the following error:
Uncaught TypeError: Cannot set property ‘rank’ of undefined.
Please also see the below code:
g.setNode('a', {label: 'A'});
g.setNode('b', {label: 'B'});
g.setNode('c', {label: 'C'});
g.setNode('d', {label: 'D'});
g.setNode('top_group', {label: 'Top Group', clusterLabelPos: 'bottom', style: 'fill: #ffd47f'});
g.setNode('bottom_group', {label: 'Group', clusterLabelPos: 'top', style: 'fill: #d3d7e8'});
// Set the parents to define which nodes belong to which cluster
g.setParent('a', 'top_group');
g.setParent('b', 'bottom_group');
g.setParent('c', 'bottom_group');
g.setParent('d', 'bottom_group');
// Draw edges
g.setEdge('a', 'b');
g.setEdge('b', 'c');
g.setEdge('b', 'd');
// Set edge from child to parent
g.setEdge('a', 'bottom_group'); // THIS LINE CAUSES THE ABOVE ERROR
The way how we create a parent is the same as how we create a child node, so the library should allow us to draw an edge from a child node to a parent node.
Can someone please advice?
This is really urgent so can someone please help.
Much appreciated, Thanks, Michael
Just curios why your trying to set and edge usingsetParent
and not setEdge
?
// Set edge from child to parent
g.setEdge('a', 'bottom_group'); // THIS LINE CAUSES THE ABOVE ERROR
(not saying it will work, just asking?)
@GordonSmith thanks for the reply. It was a typo in my question, it’s setEdge, and it’s still having the same error.
Could you please provide a jsfiddle (or equivalent?)
@koosvanderkolk Hay, thank you so much for the reply! I have created a JSFiddle for this, but you can refer to this demo repo - https://github.com/dagrejs/dagre-d3/blob/master/demo/clusters.html, you can simply pull this down and run the "Cluster" demo, please add a line "g.setEdge('b', 'bottom_group'); // Try to draw an edge from child "b" to parent "bottom_group".
" to line 78 in the clusters.html, after you done this you should see the error "Unable to draw an edge from a child to parent
".
In the meantime, I will create a JSFiddle to make this easier to debug for other helpers.
Thanks so much man, appreciate this!
If the error indeed reads "Unable to draw an edge from a child to parent" then I am afraid this isn't just possible with this library.
But maybe with your jsfiddle people can come up with a nice workaround :-).
@koosvanderkolk Okay, no problem. Thanks anyway. Here is the JSFiddle if you're interested: http://jsfiddle.net/thenylify/Lbjm54ob/8/
Thank you.
No solutions?
I don't think this is supported by this library. You could use graphviz via Viz.js
Any workaround ?
Any workaround ?
Fix here: https://github.com/dagrejs/dagre/pull/293 Workaround: https://www.npmjs.com/package/dagre-cluster-fix Workaround for cytoscape-dagre : https://www.npmjs.com/package/cytoscape-dagre-cluster-fix
if (isNode(element)) {
const { data,id } = element
if(id!=="0"){
const {parentId} = data
if(parentId===0||parentId){
g.setParent(id, parentId+"");
}
}
g.setNode(element.id, {
width: element.__rf?.width,
height: element.__rf?.height,
});
} else {
g.setEdge(element.source, element.target);
}
I used setEdge
before
but i got the graph drawn by the nodes of the second level is evenly spaced, so I think they are caused by no parent-child relationship
So you see that code
i added the setParent
I hope they can divide the space equally in their own area
but i failed
Uncaught TypeError: Cannot set properties of undefined (setting 'rank')
i don't know what to use