【问题标题】:D3.js V4 Forced Directed Graph ZoomD3.js V4 强制有向图缩放
【发布时间】:2017-01-05 10:22:25
【问题描述】:

我是 D3 的新手,只是在试验它的功能。如果这已经被覆盖,请原谅我,但我似乎找不到在我的 D3.js v4 强制有向图上实现缩放的方法。我的代码如下。

对此的任何帮助将不胜感激

<!DOCTYPE html>
<meta charset="utf-8">
<style>

.links line {
 stroke: #999;
 stroke-opacity: 0.6;
}

.nodes circle {
 stroke: #fff;
 stroke-width: 1.5px;
}

</style>
<div class="centre jumbotron">
 <h1> Title </h1>
  <h2>
   This is the home page
  </h2>
</div>
<svg width="960" height="600"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>

var svg = d3.select("svg"),
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));

d3.json("network_data#all", function(error, graph) {
 if (error) throw error;

 var link = svg.append("g")
  .attr("class", "links")
  .selectAll("line")
  .data(graph.links)
  .enter().append("line")
  .attr("stroke-width", function(d) { return Math.sqrt(d.value); });

 var node = svg.append("g")
  .attr("class", "nodes")
  .selectAll("circle")
  .data(graph.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));

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

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

 simulation.force("link")
  .links(graph.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;
 }

 </script>

【问题讨论】:

    标签: javascript d3.js zooming


    【解决方案1】:

    这很简单,并演示了here。你有一个力模拟并不重要,步骤是一样的。

    这是集成到您的示例代码中:

    <!DOCTYPE html>
    <meta charset="utf-8">
    <style>
      .links line {
        stroke: #999;
        stroke-opacity: 0.6;
      }
      
      .nodes circle {
        stroke: #fff;
        stroke-width: 1.5px;
      }
    </style>
    <div class="centre jumbotron">
     <h1> Title </h1>
      <h2>
       This is the home page
      </h2>
    </div>
    <svg width="960" height="600"></svg>
    <script src="https://d3js.org/d3.v4.min.js"></script>
    <script>
      var svg = d3.select("svg"),
        width = +svg.attr("width"),
        height = +svg.attr("height");
        
      svg.append("rect")
        .attr("width", width)
        .attr("height", height)
        .style("fill", "none")
        .style("pointer-events", "all")
        .call(d3.zoom()
          .scaleExtent([1 / 2, 4])
          .on("zoom", zoomed));
    
      var g = svg.append("g");
    
      function zoomed() {
        g.attr("transform", d3.event.transform);
      }
    
      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));
    
      d3.json("https://jsonblob.com/api/6e520635-d35c-11e6-b16a-6b255c15b1a3", function(error, graph) {
        if (error) throw error;
    
        var link = g.append("g")
          .attr("class", "links")
          .selectAll("line")
          .data(graph.links)
          .enter().append("line")
          .attr("stroke-width", function(d) {
            return Math.sqrt(d.value);
          });
    
        var node = g.append("g")
          .attr("class", "nodes")
          .selectAll("circle")
          .data(graph.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));
    
        node.append("title")
          .text(function(d) {
            return d.id;
          });
    
        simulation
          .nodes(graph.nodes)
          .on("tick", ticked);
    
        simulation.force("link")
          .links(graph.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;
      }
    </script>

    【讨论】:

    • 我已经实施了您所说的更改,但是我的图表似乎仍然没有放大。检查页面元素,“rect”属性似乎确实发生了变化,但图表似乎不在同一个属性内。
    • @FayeMatthews,你能在 plunker、jsFiddle 或 stacksn-p 中重现这个问题吗?正如您在上面的 stacksn-p 中看到的那样,我的代码确实可以集成到您展示的示例代码中。现在由您来重现您的问题。
    • 别担心,找到问题了,你的代码对我来说很好@Mark。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2018-12-08
    • 2012-09-17
    相关资源
    最近更新 更多