Как отобразить циклы в пакете networkD3 R? - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь отобразить передачу сигналов лиганд-рецептор между различными типами клеток, поэтому важно было бы использовать самопетли.

Я пытался изменить функцию forceNetwork этого пакета, чтобы она отображала самопетли без успеха. Я пробовал несколько решений ( D3 Force Layout Graph - Самосвязывающий узел ). Как я могу изменить часть ниже, чтобы позволить самостоятельные петли?

function tick() {
  node.attr("transform", function(d) {
    if(options.bounded){ // adds bounding box
        d.x = Math.max(nodeSize(d), Math.min(width - nodeSize(d), d.x));
        d.y = Math.max(nodeSize(d), Math.min(height - nodeSize(d), d.y));
    }

    return "translate(" + d.x + "," + d.y + ")"});

  function idx(d, type) {
    var linkWidthFunc = eval("(" + options.linkWidth + ")");
          var a = d.target.x - d.source.x;
          var b = d.target.y - d.source.y;
    var c = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));

        if (type == "x1") return (d.source.x + ((nodeSize(d.source) * a) / c));
        if (type == "y1") return (d.source.y + ((nodeSize(d.source) * b) / c));
        if (options.arrows) {
          if (type == "x2") return (d.target.x - ((((5 * linkWidthFunc(d)) + nodeSize(d.target)) * a) / c));
          if (type == "y2") return (d.target.y - ((((5 * linkWidthFunc(d)) + nodeSize(d.target)) * b) / c));
        } else {
          if (type == "x2") return (d.target.x - ((nodeSize(d.target) * a) / c));
          if (type == "y2") return (d.target.y - ((nodeSize(d.target) * b) / c));
        }
      }

  link
    .attr("x1", function(d) { return idx(d, "x1"); })
    .attr("y1", function(d) { return idx(d, "y1"); })
    .attr("x2", function(d) { return idx(d, "x2"); })
    .attr("y2", function(d) { return idx(d, "y2"); });

}
...