热力图矩形内的标签

5

我希望在热力图方块内显示数值,而不仅仅是在工具提示中显示。

看起来,根据https://github.com/dc-js/dc.js/issues/1303的说法,这个功能还没有被添加,但是能否通过d3.js实现呢?谢谢。

热力图:

        heatMap
            .width(1000)
            .height(400)
            .dimension(dimension)
            .group(filtered_heatMap_group)
            .margins({
                left: 200,
                top: 30,
                right: 10,
                bottom: 50
            })
            .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] + "";
            })
            .rowOrdering(d3.descending);

https://jsfiddle.net/_M_M_/jvf5ot3p/3/

1个回答

2
细节决定成败。
将文本放入框中相当容易。调整它们的位置和格式需要更多的工作。我会尝试帮你开始。
您可以使用“renderlet”事件。“pretransition”更好,但我们需要从“rect”中窃取一些属性,因为图表的比例尺不可访问,并且这些属性在“pretransition”时间并非全部初始化。
这是dc.js注释的常见模式:等待图表事件,然后选择现有元素并向其中添加内容。元素选择器在此处记录; 我们要用“g.box-group”。
其余部分是标准的D3通用更新模式,只是如我所说,我们无法访问比例尺。与其尝试复制该语言并可能出错,我们可以从已经驻留在这些“g”中的“rect”读取诸如“x”,“y”,“width”,“height”之类的属性。
SVG不支持多行文本,因此我们必须在文本元素text中创建tspan元素。
将所有内容组合起来:
  .on('renderlet.label', function(chart) {
        var text = chart.selectAll('g.box-group')
        .selectAll('text.annotate').data(d => [d]);
    text.exit().remove();
    // enter attributes => anything that won't change
    var textEnter = text.enter()
      .append('text')
      .attr('class', 'annotate')
    textEnter.selectAll('tspan')
      .data(d => [d.key[1], d.value.toolTip, d.key[0]])
      .enter().append('tspan')
      .attr('text-anchor', 'middle')
      .attr('dy', 10);
    text = textEnter.merge(text);
    // update attributes => position and text
    text
      .attr('y', function() {
        var rect = d3.select(this.parentNode).select('rect');
        return +rect.attr('y') + rect.attr('height')/2 - 15;
      });
    text.selectAll('tspan')
      .attr('x', function() {
        var rect = d3.select(this.parentNode.parentNode).select('rect');
        return +rect.attr('x') + rect.attr('width')/2;
      })
      .text(d => d);
  })

请注意,我放弃了并将文本向上推了15像素……也许有更好的方法来实现多行文本的垂直居中。
即使没有描述,文本也不完全适合。我会让你自己解决这个问题。
但是它在那里,并且能够正确更新:

labels in heatmap screenshot 2

您好!该句翻译为:您的 fiddle 的派生

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接