我用d3创建了一个图表,用于展示表面上的缺陷。表面本身宽约1000毫米,但长度可能长达几公里。为了更清楚地看到这些缺陷,我实现了d3缩放,但有时缺陷分布在x轴范围内,因此缩放到那么远会导致需要从左到右滚动。
这里是一个简化的jsFiddle。
然而,我可以改变比例尺来查看特定的缺陷,例如从1000毫米开始到1500毫米结束:
但是由于我的缺陷是矩形,所以我需要用yScale来计算宽度,就像这样:
所以,不需要平移、缩放或直接点击,上述代码就可以工作。有人能给我一个提示,我做错了什么吗?
这里是一个简化的jsFiddle。
然而,我可以改变比例尺来查看特定的缺陷,例如从1000毫米开始到1500毫米结束:
var yScale = d3.scale.linear()
.domain([1000 - margin, 1500 + margin])
.range([0, pixelHeight]);
但是由于我的缺陷是矩形,所以我需要用yScale来计算宽度,就像这样:
.attr("height", function (d) {
return yScale(d.height);
})
如果我改变比例尺的域(高度可能小于域值,导致负值),这个方法就行不通了。
那么我该如何解决这个问题呢?有没有办法计算出缺陷相对于yScale的高度?或者还有其他缩放的可能性吗?
更新 根据马克的建议,我实现了它并制作了第二个jsFiddle
我现在面临的问题也与比例尺有关。我试图修复一下,但只要使用平移或缩放,比例尺函数(xScale和yScale)就无法给出正确的值(大多数情况下是负值,因为它超出了视口)。
.on('click', function (d) {
d3.selectAll('rect').classed('selected-rect', false);
d3.select(this).classed('selected-rect', true);
var dx = xScale(d.width)*2.2,
dy = yScale(d.height)*2.2,
x = xScale(d.x) ,
y = yScale(d.y) ,
scale = .9 / Math.max(dx / width, dy / pixelHeight),
translate = [pixelWidth / 2 - (scale*1.033) * x,
pixelHeight / 2 - (scale*1.033) * y];
svg.transition()
.duration(750)
.call(zoom.translate(translate).scale(scale).event);
});
所以,不需要平移、缩放或直接点击,上述代码就可以工作。有人能给我一个提示,我做错了什么吗?