如何向从 json 文件加载的图形添加拖动节点功能

How to add drag-nodes functionality to graph loaded from json file

我正在尝试 sigma.js。 我有以下工作示例,我可以从磁盘加载我的 JSON 对象。

<script>
sigma.parsers.json( "/data/prc_network.json",
  {container: 'network-graph'},

  function(s) { //This function is passed an instance of Sigma s
    //Initialize nodes as a circle
    s.graph.nodes().forEach(function(node, i, a) {
      node.x = Math.cos(Math.PI * 2 * i / a.length);
      node.y = Math.sin(Math.PI * 2 * i / a.length);
    });
    s.refresh();
    s.startForceAtlas2();
  });
</script>

我正在查看另一个示例 drag-nodes.html,它创建了一些随机节点,然后将它们插入到图中,它还定义了 listeners(对于 drag/drop 事件)。 你能帮我解决如何添加上面的代码,其中 json 从文件 '/data/prc_network.json' 加载到以下代码(我想摆脱创建随机节点并使用从物理文件加载的节点)。我尝试了很少的想法,但它根本不起作用。

var i,
    s,
    N = 100,
    E = 500,
    g = {
      nodes: [],
      edges: []
    };

// Generate a random graph:
for (i = 0; i < N; i++)
  g.nodes.push({
    id: 'n' + i,
    label: 'Node ' + i,
    x: Math.random(),
    y: Math.random(),
    size: Math.random(),
    color: '#666'
  });

for (i = 0; i < E; i++)
  g.edges.push({
    id: 'e' + i,
    source: 'n' + (Math.random() * N | 0),
    target: 'n' + (Math.random() * N | 0),
    size: Math.random(),
    color: '#ccc'
  });

s = new sigma({  graph: g,  container: 'graph-container'});
// Initialize the dragNodes plugin:
var dragListener = sigma.plugins.dragNodes(s, s.renderers[0]);

dragListener.bind('startdrag', function(event) {  console.log(event);});
dragListener.bind('drag', function(event) {  console.log(event);});
dragListener.bind('drop', function(event) { console.log(event);});
dragListener.bind('dragend', function(event) {console.log(event); });

我终于找到了解决方案:

<script>
var g = {
      nodes: [],
      edges: []
    };

s = new sigma({
  graph: g,
  container: 'container',
   renderer: {
    container: document.getElementById('network-graph'),
    type: 'canvas'
   }
});

sigma.parsers.json( "/data/prc_network.json",s,
  function(s) { //This function is passed an instance of Sigma s
    //Initialize nodes as a circle
    s.graph.nodes().forEach(function(node, i, a) {
      node.x = Math.cos(Math.PI * 2 * i / a.length);
      node.y = Math.sin(Math.PI * 2 * i / a.length);
    });
    s.refresh();
    s.startForceAtlas2();
  });
</script>