【发布时间】:2018-07-24 03:52:54
【问题描述】:
我正在使用 d3 制作条形图,但遇到了一个问题:rect 元素中的 x 值似乎与宽度值不同,同样适用于 y 和高度值。奇怪的是,我将相同的值传递给每个对应方。
我正在测试这个问题并得到奇怪的结果,如下图所示。请注意,在设置范围时 yScale 正在反转。我的期望是矩形的四个角应该接触四个圆,但事实并非如此。这种行为有什么原因吗?
图片:
我的代码:
const xMax = dataset.length-1;
const yMax = d3.max(dataset, (d)=> d[1]);
const xScale = d3.scaleLinear()
.domain([0, xMax])
.range([padding, width-padding]);
const yScale = d3.scaleLinear()
.domain([0, yMax])
.range([height-padding,padding]);
svg.append('circle')
.attr('cx', xScale(0))
.attr('cy', yScale(0))
.attr('r', 10);
svg.append('circle')
.attr('cx', xScale(xMax))
.attr('cy', yScale(0))
.attr('r', 10);
svg.append('circle')
.attr('cx', xScale(xMax))
.attr('cy', yScale(yMax))
.attr('r', 10);
svg.append('circle')
.attr('cx', xScale(0))
.attr('cy', yScale(yMax))
.attr('r', 10);
svg.append('rect')
.style('fill', 'none')
.style('stroke', 'black')
.style('stroke-width', 2)
.attr('x', xScale(0))
.attr('y', yScale(yMax))
.attr('width', xScale(xMax))
.attr('height', yScale(yMax));
【问题讨论】:
-
“奇怪的是,我将相同的值传递给每个对应方。”。不,你不是:你将
xScale(0)传递给x位置,并将xScale(xMax)传递给宽度。这里没有错或不一致。如果你想让矩形进入 4 个圆圈,它必须是:.attr('x', xScale(0)).attr('y', yScale(yMax)).attr('width', xScale(xMax) - padding).attr('height', yScale(0) - padding); -
或者,更习惯用法:
.attr('x', xScale(0)).attr('y', yScale(yMax)).attr('width', xScale(xMax) - xScale(0)).attr('height', yScale(0) - yScale(yMax)); -
@GerardoFurtado 我明白了,感谢您的回答,对不起,我用错了。它现在有效,但我仍然不明白为什么需要减去填充。为什么不设置从
padding到width - padding的范围使xScale(xMax) 的值与width - padding相同? -
@GerardoFurtado 实际上,你知道吗。我想我现在明白了。谢谢:)
-
好,你看到矩形的右端不对应圆圈
x的位置了吗?您必须减去矩形的 x 位置才能得到它。我给你写了一个正确的答案。