I am trying to create a compound node in Cytoscape.js with labels and an edge from the child node to another node. If you run the snippet below and move the b north of a, you see that the label of a is below the edge between b and a-1, which I don’t want.
I could set z-compound-depth of a and a-1 to top, but then the edge would not be visible inside of a.
I want to position the edge on top of a, but below the label of a. How can I achieve this?
cytoscape({
container: document.querySelector(".graph"),
elements: [
{
data: {
id: "a",
},
},
{
data: {
id: "a-1",
parent: "a",
},
},
{
data: {
id: "b",
},
},
{
data: {
id: "a-1 -> b",
source: "a-1",
target: "b",
},
},
],
style: [
{
selector: "node",
style: {
label: "data(id)",
},
},
{
selector: "#a,#a-1",
style: {
// "z-compound-depth": "top", // moves the edge below the a label, but also below the a node
},
},
],
});body {
margin: 0;
}
.graph {
height: 100vh;
}<script src="https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.17.0/cytoscape.min.js"></script> <div class="graph"></div>
Advertisement
Answer
I know this does not answer your question. But you ask for something that is not simple and efficient to achieve. If you only need better visualization, applying line-opacity to the edge’s line style is an alternate approach.
cytoscape({
container: document.querySelector(".graph"),
elements: [
{
data: {
id: "a",
},
},
{
data: {
id: "a-1",
parent: "a",
},
},
{
data: {
id: "b",
},
},
{
data: {
id: "a-1 -> b",
source: "a-1",
target: "b",
},
},
],
style: [
{
selector: "node",
style: {
label: "data(id)",
},
},
{
selector: "edge",
style: {
label: "",
"line-color": "red",
"line-opacity": 0.5
},
},
{
selector: "#a,#a-1",
style: {
// "z-compound-depth": "top", // moves the edge below the a label, but also below the a node
},
},
],
});body {
margin: 0;
}
.graph {
height: 100vh;
}<script src="https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.17.0/cytoscape.min.js"></script> <div class="graph"></div>