简体   繁体   English

如何更新饼图?

[英]How to update a pie chart?

I'm trying to make a pie chart that is updated when I press the button "2016" but instead of updating I create a new pie chart, how can I change the values of my pie chart? 我正在尝试制作一个饼图,当我按下“2016”按钮时会更新,但我不是更新我创建一个新的饼图,如何更改饼图的值? Thanks in advance. 提前致谢。 I tried to search a question but all of them are so specific. 我试图搜索一个问题,但所有问题都是如此具体。

 var dataset = [{ key: "Alumnos", value: 15 }, { key: "AlumnosFCT", value: 12 }]; var w = 300; var h = 300; var outerRadius = w / 2; var innerRadius = 0; var arc = d3.svg.arc() .innerRadius(innerRadius) .outerRadius(outerRadius); var color = d3.scale.ordinal() .domain([15, 12]) .range(["#FF4081", "#3F51B5"]); var svg = d3.select("body") .append("svg") .attr("width", w) .attr("height", h); var pie = d3.layout.pie() .sort(null) .value(function(d) { return d.value; }); var arcs = svg.selectAll("g.arc") .data(pie(dataset)) .enter() .append("g") .attr("class", "arc") .attr("transform", "translate(" + outerRadius + ", " + outerRadius + ")"); arcs.append("path") .attr("fill", function(d, i) { return color(i); }) .attr("d", arc); arcs.append("text") .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; }) .attr("text-anchor", "middle") .attr("font-family", "sans-serif") .text(function(d) { return d.value; }); d3.selectAll("button").on("click", function() { var paragraphID = d3.select(this).attr("id"); if (paragraphID == "2016") { dataset.push({ key: "Alumnos", value: 20 }, { key: "AlumnosFCT", value: 18 }); dataset.shift(); dataset.shift(); } var arc = d3.svg.arc() .innerRadius(innerRadius) .outerRadius(outerRadius); var color = d3.scale.ordinal() .domain([15, 12]) .range(["#FF4081", "#3F51B5"]); var svg = d3.select("body") .append("svg") .attr("width", w) .attr("height", h); var pie = d3.layout.pie() .sort(null) .value(function(d) { return d.value; }); var arcs = svg.selectAll("g.arc") .data(pie(dataset)) .enter() .append("g") .attr("class", "arc") .attr("transform", "translate(" + outerRadius + ", " + outerRadius + ")"); arcs.append("path") .attr("fill", function(d, i) { return color(i); }) .attr("d", arc); arcs.append("text") .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; }) .attr("text-anchor", "middle") .attr("font-family", "sans-serif") .text(function(d) { return d.value; }); }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> <button id="2016">2016</button> 

In general, d3 is pretty good about managing DOM elements as long as you work within their API. 一般来说,只要你在他们的API中工作,d3就可以很好地管理DOM元素。 In that way you can write a function that can create new elements for new data, or update existing elements with new data pertaining to those elements. 通过这种方式,您可以编写一个可以为新数据创建新元素的函数,或者使用与这些元素相关的新数据更新现有元素。

See the following updated version of your code snippet, specifically pulling out the data dependent DOM manipulations into a function called update : 请参阅以下更新版本的代码片段,特别是将依赖于数据的DOM操作转移到名为update的函数中:

 /*** * Original Code ***/ var dataset = [{ key: "Alumnos", value: 15 }, { key: "AlumnosFCT", value: 12 }]; var w = 300; var h = 300; var outerRadius = w / 2; var innerRadius = 0; var arc = d3.svg.arc() .innerRadius(innerRadius) .outerRadius(outerRadius); var color = d3.scale.ordinal() .domain([15, 12]) .range(["#FF4081", "#3F51B5"]); var svg = d3.select("body") .append("svg") .attr("width", w) .attr("height", h); var pie = d3.layout.pie() .sort(null) .value(function(d) { return d.value; }); /*** * update function for data dependent manipulations ***/ function update(data) { var arcs = svg.selectAll("g.arc").data(pie(data)); arcs.exit().remove(); arcs.enter().append("g") .attr("class", "arc") .attr("transform", "translate(" + outerRadius + ", " + outerRadius + ")"); var paths = arcs.selectAll('path').data(function (d, i) { d.idx = i; return [d]; }) paths.enter().append('path'); paths .attr("fill", function(d) { return color(d.idx); }) .attr("d", arc); var texts = arcs.selectAll('text').data(function (d) { return [d]; }) texts.enter().append('text'); texts.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; }) .attr("text-anchor", "middle") .attr("font-family", "sans-serif") .text(function(d) { return d.value; }); } update(dataset); /*** * Handler to set new data based on button clicked ***/ d3.select('button').on('click', function() { var newData; if (this.id === '2016') { newData = [{ key: "Alumnos", value: 20 }, { key: "AlumnosFCT", value: 18 }]; update(newData); } }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> <button id="2016">2016</button> 

(depending on your browser, you might need to scroll the view to see the "2016" button) (根据您的浏览器,您可能需要滚动视图才能看到“2016”按钮)

Note the following advantages: 请注意以下优点:

  • only elements whose data need to change are updated when update is called. 唯一要素,其数据需要更改被更新时update被调用。
  • if you add a new data point when updating, a new element will be added without touching elements that should remain unchanged (via enter ) 如果在更新时添加新数据点,则会添加一个新元素,而不会触及应保持不变的元素(通过enter
  • if you remove a data point when updating, that element will be removed (via exit ) 如果在更新时删除数据点,则该元素将被删除(通过exit

d3 version: 3.4.11 d3版本: 3.4.11

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM