Javascript e数据 路径属性(“d”,弧)//

Javascript e数据 路径属性(“d”,弧)//,javascript,d3.js,data-visualization,Javascript,D3.js,Data Visualization,@datafunk:除了根据我的需要添加一两个功能来进行说明外,我还将您的代码精简到最简单的部分,以使其更易于理解,因为有几个部分没有任何用处,我也不喜欢这种转换(警告:我是d3新手,但我已经测试过此代码): 变量数据集={salary:[50,50,50]};d3.selectAll(“输入[type=\“range\”]”)。on(“更改”,adjustPie); 函数adjustPie(){ dataset.salary=[parseInt(document.forms[0].r0.

@datafunk:除了根据我的需要添加一两个功能来进行说明外,我还将您的代码精简到最简单的部分,以使其更易于理解,因为有几个部分没有任何用处,我也不喜欢这种转换(警告:我是d3新手,但我已经测试过此代码):




变量数据集={salary:[50,50,50]};d3.selectAll(“输入[type=\“range\”]”)。on(“更改”,adjustPie); 函数adjustPie(){ dataset.salary=[parseInt(document.forms[0].r0.value), parseInt(document.forms[0].r1.value), parseInt(document.forms[0].r2.value)];//console.log(dataset.salary); path.data(pie(dataset.salary));//更新数据
path.attr(“d”,arc);//我已经为您启动了一个JSFIDLE…根据您的情况修改它,让我们尝试修复它…感谢Imrane-在此期间对它进行了排序,只是刚刚意识到您发布了此消息。感谢您的帮助。很好的示例@Imrane Upposted:)我已经为您启动了一个JSFIDLE…根据您的情况修改它,让我们尝试修复它…感谢Imrane-在此期间对它进行了排序,直到刚刚意识到您发布了此消息。感谢您的帮助。很好的示例@Imrane Uppolated:)
d3.selectAll("input").on("change", change);
d3.select("#my_id").on("change", change);
function change() {
        path = path.data(pie(dataset.salary));
        path.transition().duration(750).attrTween("d", arcTween);
    }
<input type="range" min="0" max="500000" name="dataset" id="salary" step="5000" value="salary" class="salary" onchange="calculate();" />
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
  </head>
  <body onload="getData()">
  <form>
    <input type="range" name="dataset" value="salary" in="0" max="10" step="1"  onchange="getData" />
  </form>
  <script src="http://d3js.org/d3.v3.min.js"></script>
  <script>

      var salary_input = 3;

      function getData(salary){
        salary_input = document.forms[0].dataset.value;
        dataset.salary = [salary_input, 10 - salary_input];
        return dataset.salary;
      }


      var dataset = {
        salary:[5,5]
      }

    var width = 960,
        height = 500,
        radius = Math.min(width, height) / 2;

    var color = d3.scale.category20();

    var pie = d3.layout.pie()
        .sort(null);

    var arc = d3.svg.arc()
        .innerRadius(radius - 100)
        .outerRadius(radius - 20);

    var svg = d3.select("body").append("svg")
        .attr("width", width)
        .attr("height", height)
      .append("g")
        .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

    var path = svg.selectAll("path")
        // .data(pie(dataset.apples))
        .data(pie(dataset.salary))
      .enter().append("path")
        .attr("fill", function(d, i) { return color(i); })
        .attr("d", arc)
        .each(function(d) { this._current = d; }); // store the initial values

    d3.selectAll("input").on("change", change);
    // d3.select("#salary").on("change", change);

    var timeout = setTimeout(function() {
      // d3.select("input[value=\"oranges\"]").property("checked", true).each(change);
      d3.select("input[value=\"salary\"]").each(change);
    }, 2000);

    function change() {
      getData(salary_input);
      console.log(dataset.salary);
      clearTimeout(timeout);
      // path = path.data(pie(dataset[this.value])); // update the data
      path = path.data(pie(dataset.salary)); // update the data
      path.transition().duration(750).attrTween("d", arcTween); // redraw the arcs
    }

    // Store the displayed angles in _current.
    // Then, interpolate from _current to the new angles.
    // During the transition, _current is updated in-place by d3.interpolate.
    function arcTween(a) {
      var i = d3.interpolate(this._current, a);
      this._current = i(0);
      return function(t) {
        return arc(i(t));
      };
    }

  </script>
  </body>
</html>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"></head><body>
<form><input type="range" name="r0" in="0" max="100" step="1" />
<br><input type="range" name="r1" in="0" max="100" step="1" />
<br><input type="range" name="r2" in="0" max="100" step="1" />
</form>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var dataset={salary:[50,50,50]};d3.selectAll("input[type=\"range\"]").on("change",adjustPie);
function adjustPie() {
    dataset.salary=[parseInt(document.forms[0].r0.value),
            parseInt(document.forms[0].r1.value),
            parseInt(document.forms[0].r2.value)];//    console.log(dataset.salary);
    path.data(pie(dataset.salary)); // update the data
    path.attr("d",arc);//<<<Might replace with a transition as per @datafunk example
}
var width=400,height=400,r=Math.min(width,height)/2;
var color=d3.scale.category20c();d3.selectAll("input[type=\"range\"]").style("width","400px");
var pie =d3.layout.pie()    .sort(null);
var svg =d3.select("body").append("svg")
    .attr("width",width)    .attr("height",height)
    .append("g")        .attr("transform", "translate("+r+","+r+")");//Make external margins and backgrounds with CSS on the SVG if you want them...
var arc =d3.svg.arc()       .outerRadius(r-20);//Sort of prototype for later arcs...?
var path=svg.selectAll("path")
    .data(pie(dataset.salary))
    .enter().append("path")//<<<For implementations allowing run-time addition of range controls, paths may need to be added/filled/coloured at run-time.
    .attr("fill",function(d,i){return color(i);})
    .attr("d",arc)//    .each(function(d){this._current=d;});//store the initial values (useful for transitions, see example by @datafunk)
adjustPie();
</script></body></html>