【问题标题】:Hide Columns from heatMap从热图中隐藏列
【发布时间】:2019-02-11 18:23:41
【问题描述】:

我想根据从 yearSlicer(rowChart) 中选择的年份而不是任何其他交叉过滤器来隐藏热图中的列。

热图:

                heatMap
                    .width(1500)
                    .height(800)
                    .dimension(dimension)
                    .group(FTEMonthGroup)
                    .margins({ left: 200, top: 30, right: 10, bottom: 35 })
                    .keyAccessor(function (d) { return d.key[0]; })
                    .valueAccessor(function (d) { return d.key[1]; })
                    .colorAccessor(function (d) { return +d.value.color; })
                    .title(function (d) {
                        return "Manager:   " + d.key[1] + "\n" +
                            "FTE:  " + d.value.toolTip + "\n" +
                            "Date: " + d.key[0] + "";
                    })
                    .on('renderlet', function (chart) {
                        chart.selectAll("g.cols.axis text")
                            .attr("transform", function () {
                                var coord = this.getBBox();
                                var x = coord.x + (coord.width / 2),
                                    y = coord.y + (coord.height / 2);
                                return "rotate(-45 " + x + " " + y + ")"

                            })
                            .style("text-anchor", "right");
                    });
                heatMap.colorCalculator(function (d, i) {
                    return d.value.color === null ?
                        '#ccc' : heatMap.colors()(d.value.color);
                });




编辑:

隐藏列“隐藏”在最左边的列下,导致单元格重叠:

当前“工作”代码(重叠单元格):

格式化日期并将它们添加到二维数组中:

            var parseTime = d3.timeParse("%m/%d/%Y");
            var formatTimeYear = d3.timeFormat("%Y");
            var formatTimeMonth = d3.timeFormat("%Y - %m");
            data.forEach(function (d) {
                d.Year = formatTimeYear(parseTime(d.Month));
                d.Month = formatTimeMonth(parseTime(d.Month));
            });

                var arrayMonths = {};
                ndx.dimension(function (d) { return d }).top(Infinity).forEach(function (d) {
                    if (arrayMonths[d.Year]) {
                        arrayMonths[d.Year].add(d.Month);
                    } else {
                        arrayMonths[d.Year] = new Set();
                    }
                });

onClick 调用函数来“隐藏”未选择的年份:

                var yearsHidden = [];
                var hideYear = function (year) {
                    var index = yearsHidden.indexOf(year);
                    if (index === -1) {
                        yearsHidden.push(year);
                    } else {
                        yearsHidden.splice(index, 1);
                    }
                    var yearsHiddenArray = null;
                    yearsHidden.forEach(function (yearAdd) {
                        if (yearsHiddenArray === null) {
                            yearsHiddenArray = Array.from(arrayMonths[yearAdd]);
                        } else {
                            yearsHiddenArray = yearsHiddenArray.concat(Array.from(arrayMonths[yearAdd]));
                        }
                    })
                    heatMap.cols(yearsHiddenArray);
                    heatMap.redraw();
                    // console.log(yearsHiddenArray);
                }

yearSlicer(rowChart) onClick:

            yearSlicer.on("renderlet.somename", function (chart) {
                chart.selectAll('rect').on("click", function (d) {
                    // console.log("Key: " + d.key);
                    hideYear(d.key);
                });
            });




编辑 2:

在实施建议的解决方案时遇到了一些麻烦,这是我的分组:

            var dimension = ndx.dimension(function (d) { return [d.Month, d["Manager"]]; }),
                FTEMonthGroup = dimension.group().reduce(
                    function reduceAdd(p, v) {
                        ++p.n;
                        p.color += v.FTE;
                        p.toolTip += v.FTE;
                        return p;
                    },

                    function reduceRemove(p, v) {
                        --p.n;
                        if (p.n === 0) {
                            p.color = null;
                            p.toolTip = null;
                        }
                        return p;
                    },

                    function reduceInitial() {
                        return { n: 0, color: 0, toolTip: 0 };
                    });

【问题讨论】:

  • 查看文档,似乎有一个cols 方法可以用于此?
  • 太棒了!您应该发布解决方案以帮助他人:)
  • @aug 我关闭了,我可以隐藏列,但它们隐藏在最左边的列下,这意味着所述列现在有重叠的单元格。将使用新的屏幕截图更新问题。
  • @aug iv 更新了问题以包括新的屏幕截图,以及导致单元格重叠的“工作”代码。谢谢

标签: javascript d3.js dc.js


【解决方案1】:

不幸的是,虽然.cols().rows() 似乎很明显应该用作过滤器,但看起来图表仍然显示组中的每个条目,无论它是否列在行和列中。由于默认是从数据中提取行和列的列表,我不确定rowscols 有多大效果,除非你不指定rowOrderingcolOrdering 提供不同的排序.

我认为你需要在这里接受一个假组,比如filter_bins

function filter_bins(source_group, f) {
    return {
        all:function () {
            return source_group.all().filter(function(d) {
                return f(d.value);
            });
        }
    };
}

var filtered_years_group = filter_bins(FTEMonthGroup, function(d) {
    return !yearsHiddenArray.includes(d.Year);
}
heatMap.group(filtered_years_group);

...或者类似的东西。你懂的!

【讨论】:

  • 感谢您的帮助!但是,我在实施您的解决方案时遇到了一些困难,如果您能够进一步帮助我,我已经编辑了我的问题以包括我的维度/分组。再次感谢您的时间和帮助!
  • 我不明白。你必须告诉我问题出在哪里。
  • Iv 将您的代码添加到我的代码中,但是当我选择一年时,热图不会改变。 Iv 在我的 hideYear 函数中添加了一个检查,以纠正由于 yearsHiddenArray 为空而导致的“无法读取属性 'includes' of null”错误。谢谢
  • 如果没有可运行的示例,真的很难说。显然,您需要将 yearsHiddenArray 设为全局。你知道这应该如何工作吗?
  • 很高兴你能成功!如果以后有问题,可以forkthis fiddle,它会有正确的依赖关系。由于混合了 http/https,它看起来目前在 Chrome 中运行,但不是在 Firefox 中运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 2012-03-17
  • 2014-03-29
  • 2019-12-31
相关资源
最近更新 更多