如何使用DC,D3和Crossfilter过滤数据以生成条形图?

时间:2014-08-03 23:06:54

标签: javascript d3.js dc.js crossfilter

下面会生成一个条形图,显示x轴上的4个人以及他们在y轴上显示的次数。但是我想过滤这些数据只计算所有者的身份,如果他们有一个ID “A”

此外,是否可以使用按钮或onClick处理程序应用此过滤器,以便在按下按钮时仅过滤ID为“A”的数据。

请参阅下面的代码和jsfiddle:http://jsfiddle.net/chrisguzman/y9xt2/

var data = [{
    Owner: "Alyssa",
    ID: "A"
}, {
    Owner: "Alyssa",
    ID: "A"
}, {
    Owner: "Alyssa",
    ID: "A"
}, {
    Owner: "Alyssa",
    ID: "A"
}, {
    Owner: "Alyssa",
    ID: "B"
}, {
    Owner: "Bob",
    ID: "A"
}, {
    Owner: "Bob",
    ID: "A"
}, {
    Owner: "Bob",
    ID: "C"
}, {
    Owner: "Bob",
    ID: "C"
}, {
    Owner: "Bob",
    ID: "C"
}, {
    Owner: "Bob",
    ID: "C"
}, {
    Owner: "Bob",
    ID: "C"
}, {
    Owner: "Bob",
    ID: "D"
}, {
    Owner: "Joe",
    ID: "A"
}, {
    Owner: "Joe",
    ID: "A"
}, {
    Owner: "Joe",
    ID: "D"
}, {
    Owner: "Joe",
    ID: "D"
}, {
    Owner: "Joe",
    ID: "E"
}];

var ndx = crossfilter(data);


var XDimension = ndx.dimension(function (d) {
    return d.Owner;
});
var YDimension = XDimension.group().reduceCount(function (d) {
    return d.Owner;
});
dc.barChart("#Chart")
    .width(480).height(300)
    .dimension(XDimension)
    .group(YDimension)
    .centerBar(true)
    .gap(56)
    .x(d3.scale.ordinal().domain(XDimension))
    .xUnits(dc.units.ordinal)
    .xAxisLabel("Market Developer")
    .yAxisLabel("Unique Counts")
    .elasticY(true)
    .xAxis().tickFormat(function (v) {
    return v;
});
dc.renderAll();

2 个答案:

答案 0 :(得分:1)

只需根据ndx创建另一个维度,并让它返回需要过滤的字段。然后,在dc.renderAll()之前,应用filter()和要过滤的键。

请参阅JS Fiddle:http://jsfiddle.net/chrisguzman/eL2XG/

var ndx = crossfilter(data);


var XDimension = ndx.dimension(function (d) {
    return d.Owner;
});
var YDimension = XDimension.group().reduceCount(function (d) {
    return d.Owner;
});

创建新维度

var FilterDimension = ndx.dimension(function (d) {
    return d.ID;
});

//

dc.barChart("#Chart")
    .width(480).height(300)
    .dimension(XDimension)
    .group(YDimension)
    .centerBar(true)
    .gap(56)
    .x(d3.scale.ordinal().domain(XDimension))
    .xUnits(dc.units.ordinal)
    .xAxisLabel("Market Developer")
    .yAxisLabel("Unique Counts")
    .elasticY(true)
    .xAxis().tickFormat(function (v) {
    return v;
});

然后按新尺寸

进行过滤
FilterDimension.filter("A");
dc.renderAll();

另外,请参阅https://groups.google.com/forum/#!msg/dc-js-user-group/UFxvUND7hmY/btbAjqIIzl8J以获得更深入的解释

这是因为

“除了关联维度的过滤器之外,分组与交叉过滤器的当前过滤器相交。因此,组方法仅考虑满足除此维度过滤器之外的每个过滤器的记录。因此,如果按类型和总计过滤付款的交叉过滤器,则group by total仅按类型观察过滤器。“

答案 1 :(得分:0)

我不确定您是否还需要知道如何将其添加到按钮中。 如果是这样,只需创建一个带有以下锚点的按钮。

<a class="filter" href="javascript:FilterDimension.filter("A");dc.redrawAll();" style="display: none;">filter</a>

<a class="reset" href="javascript:FilterDimension.filterAll();dc.redrawAll();" style="display: none;">reset</a>