Multiple lines between nodes and hierarchical layout in vis.js
Asked Answered
N

1

8

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.

Nona answered 11/4, 2017 at 15:32 Comment(0)
R
9

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>
Rosemonde answered 22/4, 2017 at 14:7 Comment(2)
To add some more support from the libraries I found recently. github.com/almende/vis/issues/2957 and github.com/almende/vis/issues/1957.Nona
@JohnM, I am looking at doing the same thing but in R, kindly help me with the same here. #48162529Dexter

© 2022 - 2024 — McMap. All rights reserved.