【问题标题】:A function in d3.js to create start and end nodes and node and link texts from a JSON source of varying sized3.js 中的一个函数,用于从不同大小的 JSON 源创建开始和结束节点以及节点和链接文本
【发布时间】:2016-10-25 19:02:28
【问题描述】:

我的 JSON 数据如下所示:

var IDData = JSON.stringify([["node/105173", "node/38180995", "Agent", "Customer", "1379644.0", 1, 264.0, "1374903"], ["node/1061", "node/21373542", "Agent", "Customer", "530848.0", 1, 3000.0, "529502"]....]

array 的数组长度不同,但里面的元素位置总是一样的。

我有下面的 jquery 函数可以遍历这些数据:

$(document ).ready(function() {
   console.log(IDData);
   var galData = JSON.parse(IDData);
   var startnodes = [];
   var endnodes = [];
   var startnodetype = [];
   var endnodetype = [];
   var PayTime = [];
   var TXN_COUNT = [];
   var Total_Amt = [];
   var SendTime = [];

galData.map(function(e,i){
   startnodes.push(e[0]);
   endnodes.push(e[1]);
   startnodetype.push(e[2]);
   endnodetype.push(e[3]);
   PayTime.push(e[4]);
   TXN_COUNT.push(e[5]);
   Total_Amt.push(e[6]);
   SendTime.push(e[7]);
 });

var final_data =createNodes(startnodes,endnodes,startnodetype,endnodetype,PayTime,TXN_COUNT,Total_Amount,SendTime);                           
 makeGraph("#Network_graph",final_data)

  });

然后将数据传递给创建节点函数,如下所示:

  function createNodes (start_nodes, end_nodes,startnodetype,endnodetype,PayTime,TXN_COUNT,Total_Amount,SendTime) {
      var node_set = d3.set(); 
      var links = [];
      var nodetype = d3.set();
      var link_Paytime  = [];
      var link_TXN_COUNT = [];
      var link_Amt = [];
      var link_SendTime = [];

    start_nodes.forEach(function(src, i){
         var tgt = end_nodes[i];
         node_set.add(src);
         node_set.add(tgt);
         links.push({source: src, target: tgt, value: 1});
      });

     startnodetype.forEach(function(src,i){
          var tgt_type = endnodetype[i];
          nodetype.add(src);
          nodetype.add(tgt_type);

  });         
    var d3GraphData = {
       nodes: node_set.values().map(function(d){ return {id: d, group: 1}}),
       links: links,
       nodetype: nodetype.values().map(function(d){return {id:d, group:1} })        
       link_Paytime: ?,
       link_TXN_COUNT: ??,
       link_Amt: ??,
       link_SendTime: ??,
            }
         return d3GraphData;
         };
  function makeGraph (selector, d3GraphData) {
      var svg = d3.select(selector),
      width = +svg.attr("width"),
      height = +svg.attr("height");

  var color = d3.scaleOrdinal(d3.schemeCategory20);
  var simulation = d3.forceSimulation()
    .force("link", d3.forceLink().id(function(d) { return d.id; }))
    .force("charge", d3.forceManyBody())
    .force("center", d3.forceCenter(width / 2, height / 2));

var link = svg.append("g")
    .attr("class", "links")
    .selectAll("line")
    .data(d3GraphData.links)
    .enter()
    .append("line")
    .attr("stroke-width", function(d) { return Math.sqrt(d.value); })
    .on("mouseout",function() {div.html("Hover over the link");})
    .on("mouseover",mouse_link);  // calling mouseover function for links

 var node = svg.append("g")
      .attr("class", "nodes")
      .selectAll("circle")
      .data(d3GraphData.nodes)
     .enter()
     .append("circle")
     .attr("r", 5)
     .attr("fill", function(d) { return color(d.group); })
     .call(d3.drag()
     .on("start", dragstarted)
     .on("drag", dragged)
     .on("end", dragended)
    )
     .on("mouseout",function() {div.html("Hover over the node");})
     .on("mouseover",mouse_node);   //calling the mouseover function for nodes

    node.append("title")
      .text(function(d) { return d.id; });

   simulation
     .nodes(d3GraphData.nodes)
     .on("tick", ticked);

   simulation.force("link")
       .links(d3GraphData.links);

   function ticked() {
     link
       .attr("x1", function(d) { return d.source.x; })
       .attr("y1", function(d) { return d.source.y; })
       .attr("x2", function(d) { return d.target.x; })
       .attr("y2", function(d) { return d.target.y; });

    node
       .attr("cx", function(d) { return d.x; })
       .attr("cy", function(d) { return d.y; });

  }

  function dragstarted(d) {
           if (!d3.event.active) simulation.alphaTarget(0.3).restart();
           d.fx = d.x;
           d.fy = d.y;
   }

 function dragged(d) {
          d.fx = d3.event.x;
          d.fy = d3.event.y;
  }

 function dragended(d) {
         if (!d3.event.active) simulation.alphaTarget(0);
         d.fx = null;
         d.fy = null;
}

   function mouse_node(d){
         div.html{"Node text is" + d.nodetype
          .
   function mouse_link(d){
            div.html("Link text is " + d.link_PayTime,d.link_TXN_COUNT,d.link_Amt,d.link_SendTime);
                            } 
};

下面应该是 HTML:

    <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="http://d3js.org/d3.v4.min.js"></script>
    <div id="graph"></div>
    <div id="text">Hover over the link</div>
    <div id= "text">Hover over the node</div>

使用这个 d3 库作为参考: http://bl.ocks.org/mbostock/4062045 在 makeGraph 代码中; 如上所示,我能够添加开始节点和结束节点并形成链接。我还可以从中渲染图表。但我也需要一种填充方式

    nodetype,link_Paytime, link_TXN_COUNT,link_Amt, link_SendTime 

并在 d3GraphData 中使用它们,稍后将用作节点和链接上的“文本”。这是我在 d3.js 上的第一个项目。

【问题讨论】:

    标签: javascript jquery d3.js


    【解决方案1】:

    以下是在节点和链接上悬停时显示文本的工作代码:

    https://jsfiddle.net/vishy1988/t6ycuoyo/21/

         var tooltip = d3.select("body")
      .append("div")
      .attr("class", "tooltip")
      .style("opacity", 0);
    
       var link = svg.append("g")
        .attr("class", "links")
        .selectAll("line")
        .data(d3GraphData.links)
        .enter().append("line")
        .attr("stroke-width", function(d) {
          return Math.sqrt(d.value);
          .on('mouseover', function(d) {
              tooltip.transition()
                .duration(300)
                .style("opacity", .8);
              tooltip.html("<p/>Paytime:" + d.paytime + "<p/>Txn_count:" + d.txn_count + "<p/>Amount:" + d.Total_Amt + "<p/>SendTime:" + d.SendTime)
    
              .style("left", (d3.event.pageX) + "px")
                .style("top", (d3.event.pageY + 10) + "px");
            })
            .on("mouseout", function() {
              tooltip.transition()
                .duration(100)
                .style("opacity", 0);
            })
            .on("mousemove", function() {
              tooltip.style("left", (d3.event.pageX) + "px")
                .style("top", (d3.event.pageY + 10) + "px");
            });
        });
    
      var node = svg.append("g")
        .attr("class", "nodes")
        .selectAll("circle")
        .data(d3GraphData.nodes)
        .enter().append("circle")
        .attr("r", 5)
        .attr("fill", function(d) {
          return color(d.group);
        })
        .on('mouseover', function(d) {
          tooltip.transition()
            .duration(300)
            .style("opacity", .8);
          tooltip.html(d.id + "<p/>type:" + d.type)
            .style("left", (d3.event.pageX) + "px")
            .style("top", (d3.event.pageY + 10) + "px");
        })
        .on("mouseout", function() {
          tooltip.transition()
            .duration(100)
            .style("opacity", 0);
        })
        .on("mousemove", function() {
          tooltip.style("left", (d3.event.pageX) + "px")
            .style("top", (d3.event.pageY + 10) + "px");
        })
    
      .call(d3.drag()
        .on("start", dragstarted)
        .on("drag", dragged)
        .on("end", dragended));
    
        simulation
        .nodes(d3GraphData.nodes)
        .on("tick", ticked);
    
      simulation.force("link")
        .links(d3GraphData.links);
    
      function ticked() {
        link
          .attr("x1", function(d) {
            return d.source.x;
          })
          .attr("y1", function(d) {
            return d.source.y;
          })
          .attr("x2", function(d) {
            return d.target.x;
          })
          .attr("y2", function(d) {
            return d.target.y;
          });
    
        node
          .attr("cx", function(d) {
            return d.x;
          })
          .attr("cy", function(d) {
            return d.y;
          });
      }
    
      function dragstarted(d) {
        if (!d3.event.active) simulation.alphaTarget(0.3).restart();
        d.fx = d.x;
        d.fy = d.y;
      }
    
      function dragged(d) {
        d.fx = d3.event.x;
        d.fy = d3.event.y;
      }
    
      function dragended(d) {
        if (!d3.event.active) simulation.alphaTarget(0);
        d.fx = null;
        d.fy = null;
      }
    
    }
    

    【讨论】:

    • 很高兴您找到了解决方案!
    【解决方案2】:

    因此,如果我正确理解您的问题,您的程序部分工作,但您想添加一些数据(nodetype、link_Paytime、link_TXN_COUNT、link_Amt 和 link_SendTime)作为节点和链接上的文本?您(也)正在尝试初始化 d3GraphData 并想要替换问号(通过数组中的正确项目)?

    您是否有现有示例(可能来自D3 gallery)来说明您要添加的内容(节点和链接上的文本)?

    有一个完整的工作示例来说明您正在构建的内容会很有帮助,例如这个 html 文件(这不起作用):

    <!DOCTYPE html>
    <meta charset="utf-8">
    
    <svg width="960" height="600"></svg>
    
    <script src="https://d3js.org/d3.v4.min.js"></script>
    
    <script
        src="http://code.jquery.com/jquery-3.1.1.min.js"
        integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
        crossorigin="anonymous">
    </script>
    
    <script>
    
    var IDData = JSON.stringify([
            ["node/105173", "node/38180995", "Agent", "Customer", "1379644.0", 1, 264.0, "1374903"],
            ["node/1061", "node/21373542", "Agent", "Customer", "530848.0", 1, 3000.0, "529502"]
        ]);
    
    $(document).ready(function() {
        console.log(IDData);
    
        var galData = JSON.parse(IDData);
        var startnodes = [];
        var endnodes = [];
        var startnodetype = [];
        var endnodetype = [];
        var PayTime = [];
        var TXN_COUNT = [];
        var Total_Amt = [];
        var SendTime = [];
    
        galData.map(function(e, i) {
            startnodes.push(e[0]);
            endnodes.push(e[1]);
            startnodetype.push(e[2]);
            endnodetype.push(e[3]);
            PayTime.push(e[4]);
            TXN_COUNT.push(e[5]);
            Total_Amt.push(e[6]);
            SendTime.push(e[7]);
        });
    
        var final_data = createNodes(startnodes, endnodes, startnodetype, endnodetype, PayTime, TXN_COUNT, Total_Amt, SendTime);
    
        makeGraph("#Network_graph", final_data);
    });
    
    function createNodes (start_nodes, end_nodes,startnodetype,endnodetype,PayTime,TXN_COUNT,Total_Amount,SendTime) {
          var node_set = d3.set(); 
          var links = [];
          var nodetype = d3.set();
          var link_Paytime  = [];
          var link_TXN_COUNT = [];
          var link_Amt = [];
          var link_SendTime = [];
    
        start_nodes.forEach(function(src, i){
             var tgt = end_nodes[i];
             node_set.add(src);
             node_set.add(tgt);
             links.push({source: src, target: tgt, value: 1});
          });
    
         startnodetype.forEach(function(src,i){
              var tgt_type = endnodetype[i];
              nodetype.add(src);
              nodetype.add(tgt_type);
         });
    
        var d3GraphData = {
           nodes: node_set.values().map(function(d){ return {id: d, group: 1}}),
           links: links,
           nodetype: nodetype.values().map(function(d){return {id:d, group:1} }),
           link_Paytime: 1,
           link_TXN_COUNT: 2,
           link_Amt: 3,
           link_SendTime: 4,
        };
    
        return d3GraphData;
    }
    
    function makeGraph (selector, d3GraphData) {
             //graph code that already works
    }
    
    </script>
    

    【讨论】:

    • 用 d3 参考链接更新了问题。是的,我需要将一些数据作为文本添加到节点和链接。“Nodetype”是节点数据,其余的是链接数据。我知道我可以为此使用 d3.js 函数,例如“mouseover”。是的,我正在尝试初始化 d3GraphData 并想用正确的项目替换问号。我不知道如何填充它们。
    • 另外,添加了更多关于我如何制作图表以及我计划如何将文本添加到节点和链接的代码。
    • 在尝试运行代码时仍然遇到问题(例如 div 未定义)。如果没有运行示例来显示仍然缺少的内容,我无法提出更多建议(有关更多信息,请参阅stackoverflow.com/help/mcve)。建议:在您的问题和/或JSFiddle 等网站上添加所有相关源代码。
    • 现在还添加了 HTML。唯一缺少的是如何获取:nodetype,link_Paytime,link_TXN_COUNT,link_Amt,link_SendTime 以便可以用于函数makegraph。
    • 信息够不够?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多