【问题标题】:How to transition only the radius property of an arc d3.js如何仅转换圆弧 d3.js 的半径属性
【发布时间】:2015-12-06 04:27:20
【问题描述】:

我想为 SVG 中仅扩展外半径的所有路径元素添加过渡。我正在尝试为我制作的所有这些迷你弧线创造一种不断增长的效果。

制作完所有弧线后,我只希望为所有弧线扩展外半径。因此,例如,我希望所有圆弧路径的外半径扩大 5,但我希望它们保留所有其他属性。我尝试更改 outerRadius 属性,然后再次调用 arc,但这会重置所有其他属性,例如开始和结束角度。 这是我的代码笔: http://codepen.io/nsohail92/pen/obNRvv

var width = 1200;
var height = 1200;
var innerRadius = height/2.5;
var outerRadius = height/2;
var count = 0;
var startAngle = 0;
var increment = (360/16) / 100; //.025
var endAngle;

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

function createArc() {

     endAngle = startAngle + increment;

     drawArc
     .innerRadius(innerRadius)
     .outerRadius(outerRadius)
     .startAngle(startAngle)
     .endAngle(endAngle);

     svg.append("path")
     .attr("d", drawArc)
     .attr("fill", "#81ecb5")
     .attr("transform", "translate(600,600)");


    if(endAngle < 5) {
        count = count + 1;
        startAngle = endAngle + .02;    
    }

    else {
    var pathArray = svg.selectAll("path");
    console.log(pathArray);

    drawArc.outerRadius(550);
    svg.select("path#path_0").transition().duration(1500).attr("d", drawArc);
    return;   
    }

    createArc();
}

createArc();

【问题讨论】:

  • 所以你是说在绘制时完全增加饼图的外半径?
  • 有很多例子说明如何做到这一点。那些不适合你怎么办?
  • @LarsKotthoff 有一些关于如何用新半径覆盖圆弧对象的示例,但我不想这样做,因为我的 for 循环中的每个拱门都有不同的角度值。有 arcTween 的例子,但我不知道如何使用它。
  • 我不清楚你要做什么——你为什么不使用饼图布局?

标签: javascript d3.js svg


【解决方案1】:

内嵌评论

var drawArcs = [];//stores all the arcs
var paths = [];//stores all the paths.

function createArc() {
  var drawArc = d3.svg.arc();//make an arc object every time.
  drawArcs.push(drawArc);//push the arc object
  endAngle = startAngle + increment;

      drawArc
        .innerRadius(innerRadius)
        .outerRadius(600)
        .startAngle(startAngle)
        .endAngle(endAngle);
     //make the path
      var path = svg.append("path")
        .attr("id", "path_" + count)
        .attr("d", drawArc)
        .attr("fill", "#81ecb5")
        .attr("transform", "translate(600,600)");
      paths.push(path);
    
      if (endAngle < 5) {
        count = count + 1;
        startAngle = endAngle + .02;
      } else {
        //each drawArc increase outer radius
        drawArcs.forEach(function(d, i) {
          d.outerRadius(750);
          //to the path put the transition for new radius
          paths[i].transition().duration(1500).attr("d", d);
        });
        return;
      }
    
      createArc();
    
    }

工作代码

var width = 1200;
var height = 1200;
var innerRadius = height / 2.5;
var outerRadius = height / 2;
var count = 0;
var startAngle = 0;
var increment = (360 / 16) / 100; //.025
var endAngle;

var vis = d3.select("body").append("svg");
var svg = vis.attr("width", width).attr("height", height); //give SVG attrs

//var arcExpand = d3.svg.arc().innerRadius(innerRadius).outerRadius(outerRadius + 40);

var drawArcs = [];
var paths = [];

function createArc() {
  var drawArc = d3.svg.arc();
  drawArcs.push(drawArc);
  endAngle = startAngle + increment;

  drawArc
    .innerRadius(innerRadius)
    .outerRadius(100)
    .startAngle(startAngle)
    .endAngle(endAngle);

  var path = svg.append("path")
    .attr("id", "path_" + count)
    .attr("d", drawArc)
    .attr("fill", "#81ecb5")
    .attr("transform", "translate(600,600)");
  paths.push(path);

  if (endAngle < 5) {
    count = count + 1;
    startAngle = endAngle + .02;
  } else {
    drawArcs.forEach(function(d, i) {
      d.outerRadius(750);
      paths[i].transition().duration(1500).attr("d", d);
    });
    return;
  }

  createArc();

}

createArc();
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 谢谢,但在我的问题中,我问如何通过仅更改 outerRadius 属性来做到这一点。我不想覆盖整个弧对象,因为我为每个弧提供了不同的开始/结束值。
  • 现在在编辑部分检查..我只改变了弧的外半径..也更新了 teh plunk
  • 这不起作用,因为我为所有弧线赋予了唯一的开始/结束角度值。我最终得到这个错误: Uncaught TypeError: Cannot read property 'startAngle' of undefined 为了帮助你能给我一个具有不同开始和结束角度值的多个拱门的例子,以及一个只改变拱门的外半径值的函数吗?
  • 我看到您没有使用任何饼图布局?你有馅饼的数据吗?
  • 这是另一个只更新圆弧外半径的例子jsfiddle.net/cyril123/wQXCL/229
【解决方案2】:

我们可以为每条路径赋予 id,我们可以为每条路径调用单独的转换

var svg = d3.select("body")
  .append("svg")
    .attr("width", 400)
    .attr("height", 400)
  .append("g")
    .attr("transform", "translate(100,100)");

var arc = d3.svg.arc()
  .innerRadius(20)
  .outerRadius(20)
  .startAngle(0)
  .endAngle(Math.PI);

svg.append("path")
  .attr("id", "arc1")
  .attr("d", arc);

arc.outerRadius(70);

d3.select("#arc1")
  .transition()
    .duration(1000)
    .attr("d", arc)

Code Fiddle

【讨论】:

  • 小提琴链接坏了。
最近更新 更多