Search code examples
vis.jsvis.js-network

Multiple lines between nodes and hierarchical layout in vis.js


I have a vis.js network graph that contains multiple edges between nodes and I am trying to have it setup with a hierarchical layout as well. If I do a normal graph without the hierarchical layout options then multiple lines are shown between nodes, however, once I turn on/place in the hierarchical layout option only one line is drawn.

Below are two plunkers showing what I mean:

https://plnkr.co/edit/c8SuBc0XjDZnn6im2vdg (Plunker with hierarchical layout off)

var options = { 
    height: '400px', 
    edges: { smooth: true, shadow: true},
    layout: {
       randomSeed: 1,
       improvedLayout: true,
       hierarchical: {
           enabled: false, //change to true to see the other graph
           direction: 'UD',
           sortMethod: 'directed'
      }
   }
}

https://plnkr.co/edit/L22bHk6kh1XKXulTjESD (Plunker with hierarchical layout on)

var options = { 
    height: '400px', 
    edges: { smooth: true, shadow: true},
    layout: {
       randomSeed: 1,
       improvedLayout: true,
       hierarchical: {
           enabled: true, //change to true to see the other graph
           direction: 'UD',
           sortMethod: 'directed'
      }
   }
}

As you can see, in the second one 2 edges from node 1 to node 3 collapse into one visually. Any help would be great.


Solution

  • I needed same thing, so I searched and found your question :)

    Seems like there's no other way to do that, only via edge attributes, like this (see a working snippet below):

    var edges = new vis.DataSet([
      {from: 1, to: 3, arrows: 'to', label: "+++++", smooth: {type: "curvedCCW", roundness: 0.4}},
      {from: 1, to: 3, arrows: 'to', label: "-----", smooth: {type: "curvedCCW", roundness: 0.2}},
      {from: 1, to: 3, arrows: 'to', label: "11111", smooth: {type: "curvedCW", roundness: 0.2}},
      {from: 1, to: 3, arrows: 'to', label: "22222", smooth: {type: "curvedCW", roundness: 0.4}},
    ]);
    

    Please share your findings on this question

    // create an array with nodes
    var nodes = new vis.DataSet([
      {id: 1, label: 'Node 1', level: 0},
      {id: 2, label: 'Node 2', level: 1},
      {id: 3, label: 'Node 3', level: 1},
      {id: 4, label: 'Node 4', level: 2},
      {id: 5, label: 'Node 5', level: 2}
    ]);
    
    // create an array with edges
    var edges = new vis.DataSet([
      {from: 1, to: 3, arrows: 'to', label: "+++++", smooth: {type: "curvedCCW", roundness: 0.4}},
      {from: 1, to: 3, arrows: 'to', label: "-----", smooth: {type: "curvedCCW", roundness: 0.2}},
      {from: 1, to: 3, arrows: 'to', label: "11111", smooth: {type: "curvedCW", roundness: 0.2}},
      {from: 1, to: 3, arrows: 'to', label: "22222", smooth: {type: "curvedCW", roundness: 0.4}},
      {from: 1, to: 2, arrows: 'to'},
      {from: 2, to: 4, arrows: 'to'},
      {from: 2, to: 5},
      {from: 3, to: 3}
    ]);
    
    // create a network
    var container = document.getElementById('mynetwork');
    var data = {
      nodes: nodes,
      edges: edges
    };
    var options = {
      interaction: {
          hover:true, 
          tooltipDelay: 300
      }, 
      height: '400px', 
      edges: { smooth: true
      },
      layout: {
          randomSeed: 1,
          improvedLayout: true,
          hierarchical: {
              enabled: true, //change to true to see the other graph
              direction: 'UD',
              nodeSpacing: 150,
              sortMethod: 'directed'
          }
      },
      configure: {},
      "physics": {
      "enabled": false,
      "minVelocity": 0.75
    }
    };
    var network = new vis.Network(container, data, options);
    #mynetwork {
      width: 600px;
      height: 400px;
      border: 1px solid lightgray;
    }
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/vis/4.19.0/vis.min.js"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/vis/4.19.1/vis.min.css" rel="stylesheet" type="text/css">
    
    <div id="mynetwork"><div class="vis-network" tabindex="900" style="position: relative; overflow: hidden; touch-action: pan-y; user-select: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); width: 100%; height: 100%;"><canvas width="600" height="400" style="position: relative; touch-action: none; user-select: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); width: 100%; height: 100%;"></canvas></div></div>