应用过滤器时,DC.js复合图表不会更新

时间:2014-08-06 21:30:38

标签: javascript d3.js dc.js crossfilter

我正在使用DC.js和crossfilter。我试图使用复合图表来存放条形图和折线图。但是,当我对数据应用过滤器时,条形和线条不会更新。如果我将图表作为独立的条形图/折线图,它们会正确更新。

以下是图表属性

复合图表

var chartScorecardComposite = dc.compositeChart("#regionMarketChart")
        .width(1002)
        .height(300)
        .margins({top: 30, right: 50, bottom: 50, left: 40})
        .dimension(chartIssuedJobsCountDim)
        .yAxisLabel("Issued on Time %")
        .rightYAxisLabel("Jobs Issued")
        .shareTitle(false)
        .x(d3.time.scale().domain([minDate, maxDate]))
        .y(d3.scale.linear().domain([0, 120]))
        .xUnits(d3.time.months)
        .compose([
            dc.barChart(chartScorecardComposite)
                .dimension(chartIssuedJobsCountDim)
                .group(chartIssuedJobsCountGroup)
                .valueAccessor(function (d) {
                    return d.value.jobCount;
                })
                .title(function(d) {
                    return (d.key.getMonth() + 1) + "/" + d.key.getFullYear()
                    + "\n# of Jobs: "
                    + d.value.jobCount;
                })
                .renderTitle(true)
                .centerBar(true)
                .gap(5)
                .useRightYAxis(true)
                .colors(["#79BAEC"]),
            dc.lineChart(chartScorecardComposite)
                .dimension(chartIssuedJobsCountDim)
                .group(chartIssuedOnTimeGroup)
                .valueAccessor(function (d) {
                    return d.value.onTimePercent;
                })
                .title(function(d) {
                    return (d.key.getMonth() + 1) + "/" + d.key.getFullYear()
                    + "\n% of Jobs Issued on Time: "
                    + d.value.onTimePercent + "%";
                })
                .renderTitle(true)
                .colors(["#808080"])
        ])
        .elasticY(true)
        .renderHorizontalGridLines(true)
        .brushOn(false)
        .renderlet(function (chart) { // Rotate the x-axis labels 45 degrees
            chart.selectAll("g.x text")
              .attr('dx', '-25')
              .attr('dy', '7')
              .attr('transform', "rotate(-45)");
        })
        .xAxis().ticks(d3.time.months).tickFormat(function(d) {
            return (d.getMonth() + 1) + "/" + d.getFullYear()
        })

条形图(渲染compositeChart时注释掉)

var issuedJobsBarChart = dc.barChart("#regionMarketChart")
        .yAxisLabel("Jobs Issued")
        .dimension(chartIssuedJobsCountDim)
        .group(chartIssuedJobsCountGroup)
        .valueAccessor(function (d) {
            return d.value.jobCount;
        })
        .title(function(d) {
            return (d.key.getMonth() + 1) + "/" + d.key.getFullYear()
            + "\n# of Jobs: "
            + d.value.jobCount;
        })
        .renderTitle(true)
        .elasticY(true)
        .elasticX(true)
        .centerBar(true)
        .gap(5)
        .brushOn(false)
        .x(d3.time.scale().domain([minDate, maxDate]))
        .xUnits(d3.time.months)
        .xAxis().tickFormat(function(d) {
            return (d.getMonth() + 1) + "/" + d.getFullYear()
        })

折线图(渲染compositeChart时注释掉)

var issuedOnTimeLineChart = dc.lineChart(chartScorecardComposite)
        .width(800)
        .height(250)
        .margins({top: 30, right: 25, bottom: 50, left: 40})
        .yAxisLabel("Issued on Time %")
        .renderHorizontalGridLines(true)
        .renderVerticalGridLines(true)
        .dimension(chartIssuedJobsCountDim)
        .group(chartIssuedOnTimeGroup)
        .valueAccessor(function (d) {
            return d.value.onTimePercent;
        })
        .brushOn(false)
        .y(d3.scale.linear().domain([0, 120]))
        .x(d3.time.scale().domain([minDate, maxDate]))
        .xUnits(d3.time.months)
        .xAxis().ticks(d3.time.months).tickFormat(function(d) {
            return (d.getMonth() + 1) + "/" + d.getFullYear()
        })

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

在玩了一些代码之后,我能够通过分别定义线条和条形图然后在复合图表的compose方法中调用它来实现这一目的。

var issuedOnTimeLineChart = dc.lineChart(chartScorecardComposite)
        .dimension(chartIssuedJobsCountDim)
        .group(chartIssuedOnTimeGroup)
        .valueAccessor(function (d) {
            return d.value.onTimePercent;
        })
        .colors(["#808080"])
        .brushOn(false)
        .y(d3.scale.linear().domain([0, 120]))
        .x(d3.time.scale().domain([minDate, maxDate]))

    var issuedJobsBarChart = dc.barChart(chartScorecardComposite)
        .dimension(chartIssuedJobsCountDim)
        .group(chartIssuedJobsCountGroup)
        .valueAccessor(function (d) {
            return d.value.jobCount;
        })
        .title(function(d) {
            return (d.key.getMonth() + 1) + "/" + d.key.getFullYear()
            + "\n# of Jobs: "
            + d.value.jobCount;
        })
        .renderTitle(true)
        .centerBar(true)
        .gap(5)
        .colors(["#79BAEC"])
        .brushOn(false)
        .useRightYAxis(true)
        .x(d3.time.scale().domain([minDate, maxDate]))
        .xUnits(d3.time.months)


    //Define the composite chart
    var chartScorecardComposite = dc.compositeChart("#regionMarketChart")
        .width(1002)
        .height(300)
        .margins({top: 30, right: 50, bottom: 50, left: 40})
        .dimension(chartIssuedJobsCountDim)
        .yAxisLabel("Issued on Time %")
        .rightYAxisLabel("Jobs Issued")
        .shareTitle(false)
        .x(d3.time.scale().domain([minDate, maxDate]))
        .y(d3.scale.linear().domain([0, 120]))
        .xUnits(d3.time.months)
        .compose([
            issuedJobsBarChart,
            issuedOnTimeLineChart
        ])
        .elasticY(true)
        .renderHorizontalGridLines(true)
        .brushOn(false)
        .renderlet(function (chart) { // Rotate the x-axis labels 45 degrees
            chart.selectAll("g.x text")
              .attr('dx', '-25')
              .attr('dy', '7')
              .attr('transform', "rotate(-45)");
        })
        .xAxis().ticks(d3.time.months).tickFormat(function(d) {
            return (d.getMonth() + 1) + "/" + d.getFullYear()
        })

这允许应用于维度的任何过滤器正确呈现和更新

答案 1 :(得分:0)

我看到了相同的结果。

我认为它首先被声明时起作用,因为在闭包中没有设置chartScorecardComposite的值。