我想在D3js中用缩放和平移功能创建一个热图。到目前为止,我的pan功能可以正常工作,但我在缩放功能方面存在一些小问题。变焦时改变椭圆的宽度
缩放功能只能在x轴的方向上缩放(拉伸/挤压),此时它会进行缩放(拉伸/挤压)。现在,热图的初始视图 - 当我加载脚本时 - 显示整个数据集都是挤压点,这正是我想要的。问题在于,当我放大时,挤压的点会受到挤压,导致它们之间的巨大间隙。我想要的是缩放SVG椭圆(点)的dotWidth
以避免这种情况。但是,我不知道如何实现它。以下是我的脚本中的一些代码示例。
更具体地说:如果椭圆的初始高度和宽度分别为1和3,我希望宽度在1和3之间缩放,因此它会变成最大缩放下的圆。
创建热图:
var dotWidth = 1
var dotHeight = 3
// Heatmap ellipes
svg.selectAll("ellipse")
.data(dataset)
.enter()
.append("ellipse")
.attr("cx", function(d) { return xScale(d.day) + paddingLeft; })
.attr("cy", function(d) { return yScale(d.hour); })
.attr("rx", dotWidth)
.attr("ry", dotHeight)
.attr("fill", function(d) {
return "rgba(100, 200, 200, " + colorScale(d.tOutC) + ")";
});
创建变焦:
var zoom = d3.behavior.zoom()
.scaleExtent([1, 3])
.x(xScale)
.on("zoom", zoomHandler);
function zoomHandler() {
var t = zoom.translate(),
tx = t[0],
ty = t[1];
tx = Math.min(tx, 0); // tx < 0
tx = Math.max(tx, -1000); //
zoom.translate([tx, ty]);
svg.select(".x.axis").call(xAxis);
svg.selectAll("ellipse")
.attr("cx", function(d) { return xScale(d.day) + paddingLeft; })
.attr("cy", function(d) { return yScale(d.hour); });
}
谢谢@Karolinka,帮助我。我其实只需要将'.attr(“rx”,function(d){return(dotWidth * d3.event.scale);})'添加到zoomHandler函数中。 – Christoffer