【问题标题】:D3 - Zooming with D3's SVG SymbolsD3 - 使用 D3 的 SVG 符号进行缩放
【发布时间】:2016-09-21 05:57:36
【问题描述】:

我想用这个小提琴显示的以下方式放大我的节点。 http://jsfiddle.net/HF57g/2/

小提琴来源:How to zoom in/out d3.time.scale without scaling other shapes bound to timeline

在小提琴的帮助下,我能够使用 SVG Circles 应用缩放。

注意:下面的代码显示,通过使用 SVG Circles,您可以获得 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";
                      })); 

小提琴下面的代码显示了从小提琴中获取缩放的 x 轴操作。如果可能的话,我想对翻译做同样的事情。

return svg.selectAll("rect.item")
    .attr("x", function(d){return scale(d);}) 

下面的代码展示了它与 SVG Circles 一起工作的方式,它展示了我认为使缩放工作的最合乎逻辑的方式。但不幸的是,它不起作用。

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);

这是一个用菱形和圆圈编辑的小提琴。 https://jsfiddle.net/g67cgt4w/

【问题讨论】:

  • 你能实现你尝试过的小提琴吗?
  • 在您的小提琴中,您有一个注释掉的部分,其中包括以下内容作为对 transform 属性的更改的一部分:scale(" + d3.event.scale+", 1)。而不是“1”(即y轴没有变化),将其更改为scale(" + d3.event.scale + "," + d3.event.scale + ")不会给出您想要完成的任务吗? (也许我误解了这个问题......毕竟我看到的是正方形而不是菱形)。
  • @thatOneGuy 给你。 jsfiddle.net/g67cgt4w
  • @MaxStarkenburg 感谢您的回复。我提到的小提琴不是我个人的作品。我试图包含 return svg.selectAll("circleDiamond.item") .attr("transform", function(d) { return "translate(" + scale(d) + ",0)scale(" + d3.event。 scale + "," + d3.event.scale + ")"; }) } 在更新事件函数中,但是不起作用。
  • 感谢 OneGuy 和 Max Sarkenburg 抽出宝贵时间帮助我。

标签: javascript d3.js svg transform translate


【解决方案1】:

https://jsfiddle.net/62vq9h8p/

在 update_events() 函数中,您不能使用“circleDiamond.item”作为选择器,因为您没有 &lt;circleDiamond&gt; 元素 - 有一个 &lt;circle&gt; svg 元素,这就是您可以使用“circle.myCircle”的原因例如。您可以设置一个更好的类,例如“.circle.diamond.item”。选择它们。所以我改变了这个并添加了

var cy = d3.transform(d3.select(this).attr("transform")).translate[1];
return "translate(" + scale(d) + "," + cy +")";

这将保持当前的 Y 定位。

d3.transform(d3.select(this).attr("transform"))

接受当前元素的变换,.translate[1] 接受翻译对象并返回 Y 值(即第二项)。如果您获得 0 索引,则可以取当前 X 值。

【讨论】:

  • 非常感谢@Ivan Kovachev
  • 感谢 Ivan 的详细解释。这对我很有帮助,希望对其他想要学习并面临同样问题的人也有帮助。干杯!
  • 嗨,Ivan,我正在尝试实现这一部分。 var cy = d3.transform(d3.select(this).attr("transform")).translate[1];return "translate(" + scale(d) + "," + cy +")";在 D3 的第 4 版中。我使用了这个人(stackoverflow.com/questions/38224875/…)制作的函数,我得到的最接近的是getTranslation(“translate(0,0)”)[1],但它不能正常工作。有什么建议吗?
  • 编辑:我得到了 var cy = getTranslation(d3.select(this).attr("transform"))[1];返回 "翻译(" + d.x + "," + cy +")";它不动:(
  • 老实说,我还没玩过 v4。
猜你喜欢
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
相关资源
最近更新 更多