Событие клика D3 Force Directed Graph не работает - PullRequest
0 голосов
/ 18 февраля 2019

Я новичок в d3.js и JavaScript.Вот мой код для силового ориентированного графа в d3 с данными файла CSV.

Перед тем, как перейти к нему, вот фрагмент кода, который я хочу сделать аналогичным http://bl.ocks.org/eesur/be2abfb3155a38be4de4

Все в графике в порядке, но событие onclick не работает.Функция щелчка, как предполагается, применяет событие click ко всем узлам в данных CSV (то есть 16 узлов), но мой график имеет только 9 узлов.

Я пытался поместить данные щелчка в эти конкретные узлы, ноне удалось вместо.Также вот данные CSV, которые я хочу нарисовать на графике

https://github.com/hohadang1999/Authorship-Network-Graph/blob/master/publications.csv

    d3.csv("publications.csv", function(error, links) {
var nodes = {};
links.forEach(function(link) {
    link.source = nodes[link.source] || 
        (nodes[link.source] = {name: link.source}); 
    link.target = nodes[link.target] || 
        (nodes[link.target] = {name: link.target});    

});
var width = 1500,
    height = 500;


var force = d3.layout.force()
    .nodes(d3.values(nodes))
    .links(links)
    .size([width, height])
    .linkDistance(180)
    .charge(-300)
    .on("tick", tick)
    .start();

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height);

svg.append("svg:defs").selectAll("marker")
    .data(["end"])      
  .enter().append("svg:marker")    
    .attr("id", String)
    .attr("viewBox", "0 -5 10 10")
    .attr("refX", 15)
    .attr("refY", -1.5)
    .attr("markerWidth", 6)
    .attr("markerHeight", 6)
    .attr("orient", "auto")
  .append("svg:path")
    .attr("d", "M0,-5L10,0L0,5");

var path = svg.append("svg:g").selectAll("path")
    .data(force.links())
  .enter().append("svg:path")
    .attr("class", "link")
    .attr("marker-end", "url(#end)")
    .style("stroke","#eee")
    .on("click", click);

var node = svg.selectAll(".node")
    .data(force.nodes())
  .enter().append("g")
    .attr("class", "node")
    .on("click", click)
    .call(force.drag);


node.append("circle")
    .attr("r", 15)
    .style("fill","lightcoral")
    .style("stroke","red");


node.append("text")
    .attr("x",20)
    .attr("dy", ".65em")
    .text(function(d) { return d.name; });


node.on("click", function )




function tick() {
    path.attr("d", function(d) {
        var dx = d.target.x - d.source.x,
            dy = d.target.y - d.source.y,
            dr = Math.sqrt(dx * dx + dy * dy);
        return "M" + 
            d.source.x + "," + 
            d.source.y + "A" + 
            dr + "," + dr + " 0 0,1 " + 
            d.target.x + "," + 
            d.target.y;
    });
    node
        .attr("transform", function(d) { 
   return "translate(" + d.x + "," + d.y + ")"; });
}
function click() {
    d3.select(this).select("circle").transition()
        .duration(750)
        .attr("r",6)
        .style("fill", "#ccc");


}



});

Чего я хочу добиться, так это события щелчка на этих узлах, как показано на графике

1 Ответ

0 голосов
/ 18 февраля 2019

Могут быть и другие проблемы (я не запускал ваш скрипт), но одна проблема, которую я ясно вижу, - это строка "node.on("click", function ), которая не отображает событие click на написанную вами функцию click().Вы должны изменить это на node.on("click", click).

...