有没有一种方法可以根据另一个字段的值来过滤维度?

时间:2019-04-10 20:11:11

标签: dc.js crossfilter

我正在为项目构建数据仪表板,并且希望能够比较同一数据集中两个不同组的数据。

我的数据集如下:

Number,Name,Gender,Race,Height,Publisher,Alignment,Weight,Superpower,Strength,Costume Colour
1,A-Bomb,Male,Metahuman,203,Marvel Comics,Good,441,Superhuman Strength,10,None
2,Abin Sur,Male,Alien,185,DC Comics,Good,90,Cosmic Power,40,Green
3,Abomination,Male,Metahuman,203,Marvel Comics,Bad,441,Superhuman Strength,10,None
4,Abraxas,Male,Cosmic Entity,1000,Marvel Comics,Bad,1000,Reality Warping,40,Green
5,Absorbing Man,Male,Metahuman,193,Marvel Comics,Bad,122,Matter Duplication,5,None
6,Adam Strange,Male,Human,185,DC Comics,Good,88,None,0,Red

我想创建两个单独的selectMenus,其中列出了字符名称,但是两个菜单中的每一个都按Publisher名称进行过滤。

因此,一个下拉列表将具有与Marvel Comics关联的所有字符,而另一个下拉列表将具有与DC Comics关联的所有字符。

设置好之后,我们的想法是仪表板可以显示一组图形,这些图形可以作为已选择的两个字符之间的比较-因此,我不希望将整个数据集分开,我只希望选择内容由发布服务器过滤。

我经历过数十个关于类似内容的不同Stack Overflow线程,但是仍然很挣扎。我已经为角色名称和角色发布者创建了尺寸,但是我真的迷失了尝试使用其中一个来过滤另一个。

到目前为止,这就是我所要做的(忽略服装颜色的东西,这是为了更远的地方)-“ heroes-information.csv”中的数据与我上面共享的格式相同。

// Bring in data from csv files

Promise.all([d3.csv("../data/heroes-information.csv"), d3.csv("../data/costume-colors.csv")])
    .then(function(data) {

        // Tidy data before use

        data.forEach(function(d) {
            d.Height = +d.Height;
            d.Weight = +d.Weight;
            d.Strength = +d.Strength;
        });

        // Bring in Heroes data

        var ndx = crossfilter(data[0]);

        // Bring in costume color data

        var ndxcol = crossfilter(data[1]);

        // Create colorScale to dynamically color pie chat slices

        var colorScale = d3.scaleOrdinal()
            .domain(data[1].map(row => row.Name))
            .range(data[1].map(row => row.RGB));

        // Define chart type

        var dccomicsSelector = dc.selectMenu('#dccomics-selector');

        // Define chart dimension

        var character = ndx.dimension(dc.pluck('Name'));
        var characterPublisher = ndx.dimension(dc.pluck('Publisher'));

        var dccomicsCharacters = character.group();
        var dccomicsPublisher = characterPublisher.group();

        dccomicsSelector
            .dimension(character)
            .group(dccomicsCharacters);


        dc.renderAll();

    });

我可能会错过一些确实很明显的东西,但是我对DC.js和Crossfilter还是很陌生,因此在使用它的过程中有些失落,任何帮助将不胜感激!

0 个答案:

没有答案