【问题标题】:d3 arc diagram - add top semi circlesd3圆弧图-添加顶部半圆
【发布时间】:2013-12-05 12:34:39
【问题描述】:

http://jsfiddle.net/pRkpL/http://fiddle.jshell.net/pRkpL/show/

我正在制作一个基于此演示的弧形图:http://bl.ocks.org/sjengle/5431779。我花了一段时间才达到这个阶段,现在图表可以以我需要的所有方式适应数据。

但是,我有两个问题:

1) 我需要创建 2 个弧形图 - 一个在黑色矩形上方(代码中命名为桶),一个在下方。作为临时修复,我使用 css3 3D 变换在 x 轴上翻转其中一个弧形图,但浏览器支持充其量是不稳定的。它确实有效,仅在 Chrome 中有效,有时您必须刷新、打开开发工具或调整小提琴框架的大小才能启动。我想用 d3 正确地做到这一点。

我认为创建红色弧线(圆的下半部分)的代码是这样的:

var radians = d3.scale.linear()
                .range([Math.PI / 2, 3 * Math.PI / 2]);

我发现如果我删除最后一个/ 2,它会显示一个完整的圆圈,但是我无法让它在我的drawTop 函数中只显示上半部分。

2) 我目前为 2 个弧形图复制了 2 个大型函数,drawTopdrawBtm。两者之间的唯一区别是数据数组(good_jumpsbad_jumps)、容器 id 和上面的弧度逻辑,如果可以解决的话。有没有办法可以将这些组合成一个,这样我就不会重复逻辑?

我是 JS 的新手,所以如果代码中有任何明显的错误,请告诉我 :) 此外,由于 json 来自外部 api,因此无法更改它。

【问题讨论】:

    标签: javascript jquery d3.js data-visualization arc-diagram


    【解决方案1】:

    要使圆弧出现在方框的顶部,您只需更改 radians 刻度的输出范围以覆盖上半部分:

    radians.range([-Math.PI / 2, Math.PI / 2]);
    

    关于第二个问题,这样做的一种方法是向您的数据添加另一个属性,该属性允许区分两种类型的弧,例如.good。完成后,您可以打开该属性的值来决定添加路径的类和radians 的范围,这是弧之间的唯一区别。

    完整的 jsfiddle here.

    【讨论】:

    • 我看到你使用 concat 并加入我的 2 个数组。如果我正确理解 concat ,这现在只是一大堆对象。新函数如何知道将路径放入哪个 g(即 top 或 btm)?
    • 现在只有一个g 元素。您可以通过它们的类(.top.btm)来区分这两种类型的弧。