【问题标题】:How can I remove spurious line on zoomable sunburst?如何删除可缩放旭日形上的虚假线?
【发布时间】:2014-03-06 16:03:58
【问题描述】:

如果你看zoomable sunburst

...如果您更改 <svg> 元素的背景颜色,那么当您放大时,您会注意到笔触一直延伸到 SVG 元素的顶部,超出了旭日形首饰。 Here 是一个示例 - 请注意从圆圈顶部向上延伸的额外线。

您在演示中看不到这一点,因为背景是白色的,笔触是白色的。但是我的笔触和背景颜色之间的对比要强烈得多,所以这条虚假的线条会产生效果。

【问题讨论】:

  • 你用的是什么浏览器?我在 Chrome 33 上看起来不错。我知道有些浏览器存在缩放问题,所以这可能是特定于浏览器的问题。
  • 我在 Chrome 33、Chrome 34 beta、Firefox 27、Safari 6.1.2、IE9 和 IE10 上得到了这个。您是否更改了 SVG 元素的背景颜色?演示“开箱即用”对我来说看起来不错,但如果您更改背景颜色(例如更改为#ccc)则不会。
  • 是的,我使用 Chrome 网络工具将 SVG 的背景颜色更改为黑色,并且在我尝试的所有缩放级别下看起来都很好。我在 mbostock 示例本身上执行此操作,但您发布的图像看起来像是来自不同的代码。看起来还有一个比图表区域大的黄色圆圈,而您所描述的线条位于该区域的边缘。似乎这可能是您的实施所特有的?
  • 我已经更改了示例截图:使用 Chrome 我直接在示例上编辑了 SVG 的背景颜色,然后放大。
  • 我在 Mac 上,运行 MacOSX 10.8.5

标签: javascript d3.js sunburst-diagram


【解决方案1】:

发生的情况是,当您放大一个片段时,不是它的子片段的片段会折叠到零角度。但是它们仍然被绘制,并且仍然被白色抚摸。这很容易被忽略,因为 (a) 白色笔划与白色背景相匹配,并且 (b) 任何相邻的弧线都绘制在上面。但是,如果背景不是白色并且显示的弧线没有覆盖整个深度,则您会留下折叠弧线的尖峰。

因此,解决方案是在动画过渡到零宽度后实际隐藏不属于此缩放级别的任何弧:

function click(d) {
  path.attr("opacity", 1) //turn on visibility so you can see animation
      .transition()
      .duration(750)
      .attrTween("d", arcTween(d)) 
         //this creates a tween for *all* elements based on the clicked element's data
         //when the transition comletes, the domain of the x scale will be the 
         //extent of this element and all its children
      .transition().duration(0)
          //create a zero-length transition that will start
          //after the shape transition completes
      .style("opacity", function(d2,i2) {
            return ((d2.x >= d.x + d.dx) || (d2.x + d2.dx <= d.x) )?
               //is this data outside of the domain?
                   0 : //yes - zero opacity (transparent)
                   1; //no - full opacity (visible)
      });
}

小提琴显示原始问题:http://fiddle.jshell.net/ekL8z/

用上面的代码纠正了小提琴:http://fiddle.jshell.net/ekL8z/1/

具有不透明度过渡而不是在开头和结尾更改的替代代码:
http://fiddle.jshell.net/ekL8z/2/
(我设置不透明度的原始代码是基于 x 域的最终值,因此直到第一次转换完成后才能运行,但是通过直接使用数据值,两个转换可以同时进行,这只是一个问题你更喜欢哪种外观。)

【讨论】:

  • 您的解释是有道理的,但代码并不能解决问题:-) 我抓住了演示并如上所述更改了 click() 函数,但我仍然遇到了问题。我对 d3 的了解不足以找出问题所在,但我注意到外部函数 (click) 有一个 'd' 参数,传递给 opacity 的函数也是如此。所有这些 'd' 指的是正确的 d 吗?
  • 这是一个好点,但不是问题所在。内部函数中的d 覆盖了外部d,但我怀疑问题在于代码在设置x 域的最终值之前正在运行。我将使用两个数据对象以不同的方式进行计算。
  • 很好,谢谢。我使用了您的备用代码 - 感觉最流畅。
猜你喜欢
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多