javascript – d3.js叠加栏与切换系列

前端之家收集整理的这篇文章主要介绍了javascript – d3.js叠加栏与切换系列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这次我试图创建一个带有可切换系列的堆叠条 – 基于Mike Bostock的例子(再次感谢Mike!)我已经成功地使它具有响应性和可缩放性,通过传奇的可切换系列是剩下的最后一件事.

我创建了图例项目,并使用键应用了正确的颜色:

var legendItem = d3.select(".legend")
  .selectAll("li")
  .data(keys)
  .enter()
  .append("li")
  .on('click',function(d) {
    keys.forEach(function(c) {
      if (c != d) tKeys.push(c)
    });
    fKeys = tKeys;
    tKeys = [];
    redraw();
  });

legendItem
  .append("span")
  .attr("class","color-square")
  .style("color",function(d) {
    return colorScale5(d);
  });

legendItem
  .append("span")
  .text(function(d) {
    return (d)
  });

根据结构,为了创建可切换的项目,我得出的结论是,我必须能够从键和数据集切换它 – 或者还有另一种方法吗?我已设法从键中删除特定键,但不是从数据集中删除,我不知道如何正确映射它.

第二个问题是我无法找到切换密钥的方法,只是将其删除即可.这是原始数据集:

var data = [{
  "country": "Greece","Vodafone": 57,"Wind": 12,"Cosmote": 20
},{
  "country": "Italy","Vodafone": 40,"Wind": 24,"Cosmote": 35
},{
  "country": "France","Vodafone": 22,"Wind": 9,"Cosmote": 9
}]

在从嵌套数据集提供的值中,我可以将名为“enabled”的键附加到每个对象,并且可以轻松地过滤数据集,但无法弄清楚如何附加键以帮助进行过滤过程.

edit3从问题中删除了无用的信息:

这是一个工作小提琴:
https://jsfiddle.net/fgseaxoy/2/

解决方法

SergGr的代码效果很好,但有些部分可以更干净.

的onclick

var fKeys = keys.slice();

//a helper object to record the state of keys 
var fKeyReference = fKeys.map(function () {
    return true; //used to indicate if the corresponding key is active
});

function getActiveKeys(reference) {
    return reference.map(function (state,index) {
        if (state) {
            return keys[index]; //just keep keys whoes state is true
        }
        return false; //return false to be filered
    }).filter(function (name) {
        return name
    });
}

...
.on('click',function (d) {
    if (fKeys.length === 1 && fKeys[0] === d) {
        return;
    }

    var index = keys.indexOf(d);
    fKeyReference[index] = !fKeyReference[index]; // toggle state of fKeyReference
    fKeys = getActiveKeys(fKeyReference);
    redraw();
});

.堆()

g.selectAll(".d3-group").remove();//remove all groups and draw them all again
stackedBars = g
    .selectAll(".d3-group")
    .data(d3.stack().keys(fKeys)(dataset));

更新轴(y.domain)

y.domain([
    0,1.2 * d3.max(dataset,function (d) {
        return fKeys.reduce(function (pre,key) {//calculate the sum of values of fKeys
            return pre + d[key];
        },0);
    })
]);

最后,jsfiddle

猜你在找的JavaScript相关文章