【发布时间】:2017-10-08 10:00:04
【问题描述】:
我在整个 StackOverflow 中搜索了许多更新饼图的示例,并查看了与更新 d3.js 中的饼图相关的 d3.js 块,但我似乎不能只使用 d3 进行简单的更新。 js 版本 4。我确定我错过了一些重要的东西,但我没有看到它。这个想法是单击“更新”按钮只会将数据更改为不同的集合,该集合仅由一个元素不同。我有一个 Fiddle (https://jsfiddle.net/qL9yy2b2/1/),它显示了我此时正在运行的代码(或不作为,视情况而定)。
对更新函数的初始调用会根据第一个数据集创建饼图,但由“更新”按钮启动的第二个调用什么也不做。我知道饼图生成器正在生成正确的对象(我检查了要检查的对象),但没有重绘路径。
以下是代码:
var pieGenerator = d3.pie()
.value(function(d) {return d.quantity;})
.sort(function(a, b) {
return a.name.localeCompare(b.name);
});
var fruits = [
{name: 'Apples', quantity: 20},
{name: 'Bananas', quantity: 40},
{name: 'Cherries', quantity: 50},
{name: 'Damsons', quantity: 10},
{name: 'Elderberries', quantity: 30},
];
var fruits2 = [
{name: 'Blueberries', quantity: 40},
{name: 'Bananas', quantity: 40},
{name: 'Cherries', quantity: 50},
{name: 'Damsons', quantity: 10},
{name: 'Elderberries', quantity: 30},
];
var arcGenerator = d3.arc()
.innerRadius(75)
.outerRadius(200)
.padAngle(.02)
.padRadius(100)
.cornerRadius(4);
function doUpdate() {
update(fruits2);
}
function update(myData) {
var arcData = pieGenerator(myData);
var colorDomain = myData.map(function(a) {return a.name;});
var colorScale = d3.scaleOrdinal()
.domain(colorDomain)
.range(['#ff2800','#58595B','#006c93','#8D2048','#00746F'])
// Create a path element and set its d attribute
var u = d3.select('g')
.selectAll('path')
.data(arcData);
u.enter()
.append('path')
.attr('d', arcGenerator)
.each(function(d){
d3.select(this)
.style('fill',function(d) {
return colorScale(d.data.name);
})
});
u.exit().remove();
【问题讨论】:
标签: javascript d3.js charts