在 d3plus 中单击节点时使用过滤后的数据重绘环

Redraw the ring with filtered data on click of node in d3plus

我想在点击任何节点时重新绘制图表。当用户单击任何节点时,它应该从 master Json 中过滤相应节点的数据,然后重新绘制环。我尝试了以下代码,但它不起作用。

<!doctype html>
<meta charset="utf-8">
<script src="//d3plus.org/js/d3.js"></script>
<script src="//d3plus.org/js/d3plus.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div id="viz"></div>
<script>
var flag =0;
var curr_data = [];
var connections = [
    {source : "alpha", target : "beta", read: 1, write : 0},
    {source : "alpha", target : "gamma", read: 0,  write: 1},
    {source : "alpha", target : "delta", read: 1,  write: 0},
    {source : "alpha", target : "epsilon", read: 0, write : 0},
    {source : "alpha", target : "peta" ,read: 1, write : 0},
    {source : "alpha", target : "zeta", read: 0, write : 0},
    {source : "alpha", target : "eta", read: 1, write : 1},
    {source : "beta", target : "alpha", read: 0, write : 0},
    {source : "beta", target : "gamma", read: 0,  write: 1},
    {source : "beta", target : "delta", read: 1,  write: 1},
    {source : "beta", target : "epsilon", read: 0, write : 1},
    {source : "beta", target : "peta" ,read: 1, write : 0},
    {source : "beta", target : "zeta", read: 0, write : 0},
    {source : "beta", target : "eta", read: 1, write : 1},
    {source : "gamma", target : "beta", read: 1, write : 0},
    {source : "gamma", target : "iota", read: 0,  write: 1},
    {source : "gamma", target : "delta", read: 1,  write: 0},
    {source : "gamma", target : "epsilon", read: 0, write : 0},
    {source : "gamma", target : "peta" ,read: 1, write : 0},
    {source : "gamma", target : "zeta", read: 1, write : 1},
    {source : "gamma", target : "eta", read: 1, write : 1},
    {source : "delta", target : "beta", read: 1, write : 0},
    {source : "delta", target : "gamma", read: 0,  write: 1},
    {source : "delta", target : "neta", read: 1,  write: 0},
    {source : "delta", target : "epsilon", read: 0, write : 0},
    {source : "delta", target : "peta" ,read: 1, write : 0},
    {source : "delta", target : "zeta", read: 0, write : 0},
    {source : "delta", target : "eta", read: 1, write : 1}
];
var focused_node = "alpha";
for (var v in connections){
var item = connections[v];
if (item.source.localeCompare("alpha") == 0) {
curr_data.push({
    "source": item.source,
    "target": item.target
});
}
}
$(function(){
  var visualization = d3plus.viz()
    .container("#viz")  
    .type("rings")      
    .edges(curr_data) 
    .edges({"arrows":true, "color":"#000000"})
    .edges({"arrows" : {"value": ["source","target"], "direction": "source"  }})
    .focus(focused_node)     
    .draw();
    visualization.mouse({
      click: function(dataPoint, currInstance) {
        curr_data = [];
        focused_node = dataPoint.id;
            for (var i in connections) {
                var item = connections[i];
                if (item.source.localeCompare(dataPoint.id) == 0) {
                    curr_data.push({
                        "source": item.source,
                        "target": item.target
                    });
                }
            };
      }
    });
    visualization.edges(curr_data).focus(focused_node).draw();
});
</script>

以下是plnkr的两个版本: First VersionSecond version

类似于This Scatter plot but in rings

这样试试:

var flag =0;
// This represents the edges that are shown right now.
var activeEdges = [];
// The node that is currently focused.
var focusedNode = "alpha";
var connections = [
    {source : "alpha", target : "beta", read: 1, write : 0},
    {source : "alpha", target : "gamma", read: 0,  write: 1},
    {source : "alpha", target : "delta", read: 1,  write: 0},
    {source : "alpha", target : "epsilon", read: 0, write : 0},
    {source : "alpha", target : "peta" ,read: 1, write : 0},
    {source : "alpha", target : "zeta", read: 0, write : 0},
    {source : "alpha", target : "eta", read: 1, write : 1},
    {source : "beta", target : "alpha", read: 0, write : 0},
    // ... 
    // ...
];


// Resets and creates the edges based on the focusedNode.
function refreshEdges(focusedNode) {
  activeEdges = [];
  connections.forEach( function(connection) {
    if(connection.source == focusedNode) {
      activeEdges.push({
        source: connection.source,
        target: connection.target
      });
    }
  });
}

// Draws the ring.
function drawRing(focusedNode) { 
  // Clear the contents in the container.
  $("#viz").html('');
  var visualization = d3plus.viz()
    .container("#viz")  
    .type("rings")      
    .edges(activeEdges) 
    .edges({arrows: true, color:"#000000"})
    .edges({arrows : {value: focusedNode, direction: "target"  }})
    .focus(focusedNode)     
    .mouse({
      click: function(dataPoint, currInstance) {
        refreshEdges(dataPoint.id);
        drawRing(focusedNode);
      }
    })
    .draw();
}

// Set the edges and draw ring.
refreshEdges(focusedNode);
drawRing(focusedNode);