缩放时更改椭圆的宽度

Change width of ellipse when zooming

我正在尝试在 D3js 中创建具有缩放和平移功能的热图。到目前为止,我的平移功能可以正常工作,但我在缩放功能方面遇到了一个小问题。

缩放功能应该只能在 x 轴方向上缩放 (stretch/squeeze),目前也是如此。现在,热图的初始视图(当我加载脚本时)向我显示了带有挤压点的整个数据集,这正是我想要的。问题是当我放大时,被挤压的点仍然被挤压,这导致它们之间存在巨大的差距。我想要的是缩放 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); });
}

我认为您为椭圆创建了新的 x 和 y 位置,但实际上并没有改变它们的半径。对于一个圆圈,它是这样工作的:

var scaleMultiplier = d3.event.scale;

圈子 .attr("cx", 函数(d, i) { return xAxisScale(d.cx); }) .attr("cy", function(d, i) { return yAxisScale(d.cy); }) .attr("r", function(d, i) { return (d.radius * scaleMultiplier); }); }