【问题标题】:How to create interaction with selectMenu in dc.js如何在 dc.js 中创建与 selectMenu 的交互
【发布时间】:2016-07-26 13:44:44
【问题描述】:

我正在尝试使用日期选择器创建仪表板。

我为其他人物做过,但在这里不起作用。我对 dc 很陌生,我不知道这是组的问题还是日期格式(或其他)的问题。

这是我的代码:

        d3.csv("data/saccr_realloc_test.csv", function (error, saccr) {

                var parser = d3.time.format("%d.%m.%Y");
                //var formatter=d3.time.format("%d.%m.%Y");
                saccr.forEach(function(d) {
                        d.date   = parser.parse(d.date);
                        d.ead = +d.ead;
                    });


            var cptyChart = dc.barChart("#dc-cpty-chart");
            var lineChart = dc.lineChart("#volume-chart");

            var ndx = crossfilter(saccr);

            var dimdate = ndx.dimension(function(d) { return d.date;});
            var dimline = ndx.dimension(function(d) { return d.date;});
            var minDate = dimdate.bottom(1)[0].date;
            var maxDate = dimdate.top(1)[0].date;
            var dimcpty = ndx.dimension(function(d) { return d.cpty;});
            var dimcptyC = ndx.dimension(function(d) { return d.cpty;});

            var groupdate = dimline.group().reduceSum(function(d){return d.ead/1000000;});
            var groupline = dimline.group().reduceSum(function(d){return d.ead/1000000;});
            var groupcpty = dimcpty.group().reduceSum(function(d){return d.ead/1000000;});
            var spendhisto=dimcptyC.group().reduceSum(function(d){return d.ead/1000000;});
            var groupcptyC = remove_empty_bins(spendhisto);

            //a dropdown widget
            selectField=dc.selectMenu('#menuselect')
                    .multiple(true)
                    .dimension(dimcpty)
                    .group(groupcpty)
                    .numberVisible(10);

            selectField2=dc.selectMenu('#menuselect2')
                    .dimension(dimdate)
                    .group(groupdate);


            //a line chart
            lineChart
                    .height(350)
                    .width(450)
                    .margins({top:10, right:50, bottom: 30, left: 50})
                    .dimension(dimline)
                    .group(groupline)
                    .renderArea(true)
                    .transitionDuration(500)
                    .x(d3.time.scale().domain([minDate,maxDate]))
                    .elasticY(true)
                    .renderHorizontalGridLines(true);


            var barTip2=[]; //define some tips
            cptyChart
                    .ordering(function(d){return -d.value;})
                    .height(154)
                    .width(1300)
                    .transitionDuration(500)
                    .dimension(dimcptyC)
                    .group(groupcptyC)
                    .margins({top:10, right:10, bottom: 2, left: 60})
                    .gap(1)
                    .elasticY(true)
                    .elasticX(true)
                    .x(d3.scale.ordinal().domain(dimcptyC))
                    .xUnits(dc.units.ordinal)
                    .renderHorizontalGridLines(true)
                   .yAxis().tickFormat(d3.format("s"))


                dc.renderAll();

                function remove_empty_bins(source_group) {
                    return {
                        all:function () {
                            return source_group.all().filter(function(d) {
                                return d.value > 0.00001;
                            });
                        }
                    };
                }                    
            });

https://fiddle.jshell.net/qxL2a6ev/

如果有人有答案,我将不胜感激。 非常感谢。

【问题讨论】:

  • 创建一个工作的 jsfiddle 需要更多的工作,抱歉。如果您想继续这样做,this Q&A 可能会帮助您导入数据,并且您还必须从 CDN 指向脚本,而不是使用相对路径(显然不会去任何地方)。
  • 我已将您的代码添加到您的问题中,因为如果小提琴无法运行,它并没有真正的帮助(并且通常不允许链接到 jsfiddle,因为链接最终会死)。我没有立即看到问题;您能否更详细地描述您遇到的问题?您使用的是 dc.js 的 2.1.* 版本,对吗?您是否在浏览器控制台中遇到错误?
  • 小提琴现在可以工作了,感谢提示:jsfiddle.net/3chM6/106 我使用的是 2.1 版本,我的问题是日期选择器不会触发任何交互。例如,如果我选择日期“Sat15 Apr...”,我希望在 barChart 上看到一个带有“Illumina Inc”的独特条形,但什么也没有发生...

标签: dc.js


【解决方案1】:

这里有两个错误,一个在 dc.js 中,一个在您的代码中。

首先,看起来 selectMenu 没有针对非字符串键进行调试。它正在过滤从<option> 标记中检索到的值,该标记已转换为字符串。

像往常一样,有一个解决方法。您可以通过更改 filterHandler 将字符串显式转换为日期,然后再到达维度:

var oldHandler = selectField2.filterHandler();
selectField2.filterHandler(function(dimension, filters) {
  var parseFilters = filters.map(function(d) { return new Date(d);})
  oldHandler(dimension, parseFilters);
  return filters;
});

其次,您的代码中存在复制粘贴错误。为每个图表分配新的维度和组的想法是正确的,但 groupdategroupline 应该各自从相应的维度中提取:

var groupdate = dimdate.group().reduceSum(function(d){return d.ead/1000000;});
var groupline = dimline.group().reduceSum(function(d){return d.ead/1000000;});

你的小提琴的工作分支:http://jsfiddle.net/gordonwoodhull/uterbmhd/9/

【讨论】:

  • 这正是我想做的!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 2011-07-07
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 2020-03-12
相关资源
最近更新 更多