D3 - 使用D3的SVG符号进行缩放

3
我希望以以下jsfiddle中的方式缩放节点。 http://jsfiddle.net/HF57g/2/ jsfiddle源代码: 如何在不缩放与时间轴绑定的其他形状的情况下缩放d3.time.scale 借助于这个jsfiddle,我能够使用SVG圆形应用缩放。
注意:下面的代码显示,使用SVG圆形可以提供x和y轴属性。
.enter().append("circle")
.attr("cx", function(d) { return xScale(d); })
.attr("cy", function(d) { return yScale(d); })       

我希望你可以在使用此缩放功能时,同时拥有圆和菱形。
因此,我选择了D3的“d3.svg.symbol”,以允许使用圆和菱形。
然而,我面临的问题是,通过使用D3的SVG符号,我无法专门操纵x轴,因为它只允许平移。
.enter().append("path")
.attr("transform", function(d) {
      return "translate(" + d.x + "," + d.y + ")"; })
.attr("d", d3.svg.symbol()
             .size(145)
             .type(function(d) {
                          if(d.value <= 10)
                                 return "diamond";
                          else
                             return "circle";
                      })); 

下面的代码来自fiddle,展示了对缩放x轴的操作。如果可能的话,我也想用translate做同样的事情。
return svg.selectAll("rect.item")
    .attr("x", function(d){return scale(d);}) 

下面的代码展示了如何使用SVG圆形并展示了我认为最合理的缩放方式。但不幸的是,它并没有起作用。
var zoom = d3.behavior.zoom()
           .on("zoom", function(){
           //If I use SVG Circles the following code works.
           //chart.selectAll(".item").attr("cx", function(d){ return xScale(d); });

           //By using SVG Symbols and translate, this does not work
           chart.selectAll(".item").attr("transform", function(d) { return  "translate("+ d.x +", 0)";});

            }).x(xScale);

这里有一个添加了钻石和圆圈的 fiddle。 https://jsfiddle.net/g67cgt4w/

你能把你尝试过的东西实现到 Fiddle 上吗? - thatOneGuy
在你的fiddle中,你有一个已注释的部分,其中包括以下内容作为对“transform”属性的更改的一部分:scale(" + d3.event.scale+", 1)。将其更改为scale(" + d3.event.scale + "," + d3.event.scale + ")而不是“1”(即y轴没有变化),这样做是否能实现你想要的效果?(也许我误解了问题...毕竟我看到的是方块而不是菱形)。 - Max Starkenburg
@thatOneGuy 给你。https://jsfiddle.net/g67cgt4w/ - helloGoodDay
@MaxStarkenburg 谢谢您的回复。我提到的那个fiddle不是我的个人作品。我尝试在更新事件函数中包含return svg.selectAll("circleDiamond.item") .attr("transform", function(d) { return "translate(" + scale(d) + ",0)scale(" + d3.event.scale + "," + d3.event.scale + ")"; }) }但它没有起作用。 - helloGoodDay
感谢thatOneGuy和Max Sarkenburg抽出时间来帮助我。 - helloGoodDay
1个回答

2

非常感谢 @Ivan Kovachev - helloGoodDay
谢谢Ivan的详细解释。这对我非常有帮助,希望对其他想学习和面临同样问题的人也有帮助。干杯! - helloGoodDay
嗨,伊万,我正在尝试在D3的第4版中实现以下部分:var cy = d3.transform(d3.select(this).attr("transform")).translate[1];return "translate(" + scale(d) + "," + cy +")"; 我使用了这个人编写的函数(https://dev59.com/WVoT5IYBdhLWcg3wvBik)我最接近的是getTranslation("translate(0,0)")[1],但它不能正常工作。有什么建议吗? - helloGoodDay
我只翻译内容,不进行解释:编辑:我一直在这里:var cy = getTranslation(d3.select(this).attr("transform"))[1]; return "translate(" + d.x + "," + cy +")";它没有移动 :( - helloGoodDay
老实说,我还没有尝试过v4。 - Ivan Kovachev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接