javascript 如何删除d3.js图例中的白色?

ubby3x7f  于 12个月前  发布在  Java
关注(0)|答案(2)|浏览(116)

如何删除d3.js图例中的白色(空格)?我定义了一个色标范围,它的工作完美,除了它增加了白色之间的值。下面是一个示例https://jsfiddle.net/aba2s/u46xoh97/1/

function drawLinkLegend(colorscale, min, max) {
    linkLabel.style.display = 'block'
    var legendWidth = 100
        legendMargin = 10
        legendLength = document.getElementById('legend-links-container').offsetHeight - 2*legendMargin

    var legendSvg = d3.select('#legend-links-svg')
                .append('g')
                .attr("id", "linkLegendSvg");

    var dif = colorscale.domain()[1] - colorscale.domain()[0];
    var intervals = d3.range(400).map(function(d,i) {
        return dif * i / 400 + colorscale.domain()[0]
    })
    intervals.push(colorscale.domain()[1]);
    var intervalHeight = legendLength / intervals.length;    
    var bars = legendSvg.selectAll(".bars")
      .data(intervals)
      .enter().append("rect")
        .attr("class", "bars")
        .attr("x", 0)
        .attr("y", function(d, i) { return Math.round((intervals.length - 1 - i)  * intervalHeight) + legendMargin; })
        .attr("height", intervalHeight)
        .attr("width", legendWidth-50)
        .style("fill", function(d, i) { return colorscale(d) })
        .attr("stroke-width",0)
    var legendAxis = d3.scaleLinear()
        .domain([min, max])
        .range([legendLength, 0]);
    legendSvg.append("g")
         .attr("class", "legend axis")
         .attr("transform", "translate(" + (legendWidth - 50) + ", " + legendMargin + ")")
         .call(d3.axisRight().scale(legendAxis).ticks(10))
}
8wigbo56

8wigbo561#

白色的线条来自白色的背景,每个元素的高度太小,或者svg无法呈现十进制的高度,然后背景就到了前面。
您可以使用(向上舍入)解决此问题:

.attr("height", Math.ceil(intervalHeight))

https://jsfiddle.net/falkedesign/1am0b3xu/

dwthyt8l

dwthyt8l2#

在创建图例时,您为每个图例色块设置了intervalHeight的高度,并根据intervalHeight计算了每个图例块的放置位置的y属性,但是,您对计算的y属性进行了舍入,这有时会使y值高于应有值,导致间隙。
要解决这个问题,可以将y修改为

function(d, i) { return ((intervals.length - 1 - i)  * intervalHeight) + legendMargin; }

没有四舍五入,或一个整洁的解决方案,我发现是使高度只是大了一点,以桥梁的差距正在设置

.attr("height", intervalHeight + 1)

这样一来,每一条的高度都有点太高了,但无论如何都会被下一条所掩盖。唯一的视觉差异是白色间隙不再存在。

相关问题