Как сделать узлы на диаграмме Санки интерактивными с помощью библиотеки d3.js

Фрагмент кода: для этого мы используем d3.js. Диаграммы Санки состоят из узлов и связей. Здесь данные берутся из файла json. Итак, как сделать все узлы кликабельными. Какие методы мы можем использовать с прямоугольниками, чтобы мы могли сделать узлы кликабельными.

<script>

var margin = {top: 1, right: 1, bottom: 6, left: 1},
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var formatNumber = d3.format(",.0f"),   //decimal places
    format = function(d) { return formatNumber(d) + " TWh"; },
    color = d3.scale.category20();

var svg = d3.select("#chart").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

var sankey = d3.sankey()
    .nodeWidth(15)
    .nodePadding(10)
    .size([width, height]);

var path = sankey.link();

//d3.json("energy.json", function(energy) {


d3.json("numbers-subset.json", function(energy) {



  sankey
      .nodes(energy.nodes)
      .links(energy.links)
      .layout(32);

  var link = svg.append("g").selectAll(".link")
      .data(energy.links)
    .enter().append("path")
      .attr("class", "link")
      .attr("d", path)
      .style("stroke-width", function(d) { return Math.max(1, d.dy); })
      .sort(function(a, b) { return b.dy - a.dy; });


  link.append("title")
      .text(function(d) { return d.source.name + " → " + d.target.name + "\n" + format(d.value); });


  var node = svg.append("g").selectAll(".node")
      .data(energy.nodes)
    .enter().append("g")
      .attr("class", "node")
      .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
    .call(d3.behavior.drag()
      .origin(function(d) { return d; })
      .on("dragstart", function() { this.parentNode.appendChild(this); })
      .on("drag", dragmove));

  node.append("rect")
      .attr("height", function(d) { return d.dy; })
      .attr("width", sankey.nodeWidth())
      .style("fill", function(d) { return d.color = color(d.name.split("|")[0]); })
      .style("stroke", function(d) { return d3.rgb(d.color).darker(2); })
    .append("title")
      .text(function(d) { return d.name + "\n" + format(d.value); });

  node.append("text")
      .attr("x", -6)
      .attr("y", function(d) { return d.dy / 2; })
      .attr("dy", ".35em")
      .attr("text-anchor", "end")
      .attr("transform", null)
      .text(function(d) { return d.name; })
    .filter(function(d) { return d.x < width / 2; })
      .attr("x", 6 + sankey.nodeWidth())
      .attr("text-anchor", "start");

  function dragmove(d) {
    d3.select(this).attr("transform", "translate(" + d.x + "," + (d.y = Math.max(0, Math.min(height - d.dy, d3.event.y))) + ")");
    sankey.relayout();
    link.attr("d", path);
  }



});

</script>

person Yatin Shirwadkar    schedule 05.06.2015    source источник
comment
Вы нашли решение этой проблемы? Я хочу сделать то же самое.   -  person tmthyjames    schedule 19.06.2015
comment
да я нашел решение   -  person Yatin Shirwadkar    schedule 25.06.2015
comment
var node = svg.append(g).selectAll(.node) .data(energy.nodes) .enter().append(g) .attr(класс, узел) .attr(transform, function(d) { return translate ( + dx + , + dy + ); }) .call(d3.behavior.drag() .origin(function(d) { return d; }) .on(dragstart, function() { this.parentNode.appendChild( this); }) .on(drag, dragmove) .on(click, function(d){//добавить код, который вы хотите, когда происходит событие click}));   -  person Yatin Shirwadkar    schedule 25.06.2015
comment
просто добавьте последнюю функцию .on(click, function(d) {})   -  person Yatin Shirwadkar    schedule 25.06.2015
comment
В итоге я сделал что-то подобное. Благодарю вас!   -  person tmthyjames    schedule 25.06.2015


Ответы (1)


D3.js — очень мощная библиотека, позволяющая контролировать каждое событие для каждого пикселя. но нам нужно сделать одну вещь в случае событий. Перекрывающееся событие, которое нам нужно забыть.

Добавьте следующий код в code.

var node = svg.append("g").selectAll(".node")
      .data(graph.nodes)
    .enter().append("g")
      .attr("class", "node")
      .attr("transform", function(d) { 
          return "translate(" + d.x + "," + d.y + ")"; })
    .on("click",function(d){
        if (d3.event.defaultPrevented) return;
        alert("clicked!"+d.value);
    })
    .call(d3.behavior.drag()
      .origin(function(d) { return d; })
      .on("dragstart", function() { 
          this.parentNode.appendChild(this); })
      .on("drag", dragmove));
person Yogesh Bombe    schedule 15.09.2015