javascript - 将文本和一些基本动画放在圆弧中

标签 javascript d3.js

我对 D3 还很陌生,但我有 HTML、CSS 和 JavaScript 的基本知识。我的任务是在 MS Sharepoint 中为我们的团队创建一个仪表板(以前是在 Excel 中,哈哈)。

现在,我只需要 6 个弧线即可在网站页面上直观地呈现。我可以从 sharepoint 中提取数据列表并通过 javascript 进行计算,然后将其存储在变量中以将其放入 D3 弧中。这是我当前的代码:

<body>

    <div class="container" id="graph_container1">
        <svg id="svg1"></svg>
        <svg id="svg2"></svg>
        <svg id="svg3"></svg>
    </div>

    <script>

            var canvas = d3.select("#svg1")
                        .attr("width", 400)
                        .attr("height", 400);

            var group = canvas.append("g")
                        .attr("transform", "translate(150, 150)");

            var r = 100;
            var p = Math.PI * 2;
            var score = 70;
            var finalScore = p * (70/100);

            var arc = d3.arc()
                    .innerRadius(r)
                    .outerRadius(80)
                    .startAngle(0)
                    .endAngle(finalScore);

            group.append("path").attr("d", arc)
                                .attr("fill", "orange")
                                .transition()
                                .ease(d3.easeLinear)
                                .duration(2000)
                                .attrTween("d", pieTween);

            function pieTween(b) {          
                b.innerRadius = 0;
                var i = d3.interpolate( {startAngle: 0, endAngle: 0}, b );
                return function(t) { return arc(i(t));};            
            }


    </script>

</body>

我现在有 3 个主要问题:

  1. 将乐谱文本放在弧形图的中间

  2. 为弧形图制作一个简单的动画,例如填充图表直到最终得分

  3. 再创建 5 个类似的图表

我正在复制这个动画:https://www.youtube.com/watch?v=kK5kKA-0PUQ 。我尝试了它的代码,但它不起作用。

最佳答案

  1. 由于在饼图/圆环图中,通常会将一组翻译到图表的中心(此处就是这种情况),因此只需使用 text-anchor 附加文本作为 middle (此处仅使用 2 位小数):

    group.append("text")
        .attr("text-anchor", "middle")
        .text(d3.format(".2f")(finalScore))
    
  2. 您的 pieTween 函数有一个参数 (b),但没有传递任何参数,因为没有数据绑定(bind)。除此之外,弧线生成器以 finalScore 作为结束 Angular ,因此不可能进行任何过渡。

    相应地更改圆弧生成器和 pieTween 函数:

    var arc = d3.arc()
        .innerRadius(r)
        .outerRadius(80)
        .startAngle(0);
    
    function pieTween() {
        var i = d3.interpolate({
            endAngle: 0
        }, {
            endAngle: finalScore
        });
        return function(t) {
            return arc(i(t));
        };
    }
    
  3. 对于 S.O. 来说太宽泛了,听起来像是一个请求。自己尝试一下,如果不能,请提出另一个问题(共享不起作用的代码)。

以下是经过这些更改的代码:

<body>

  <div class="container" id="graph_container1">
    <svg id="svg1"></svg>
    <svg id="svg2"></svg>
    <svg id="svg3"></svg>
  </div>
  <script src="https://d3js.org/d3.v5.min.js"></script>
  <script>
    var canvas = d3.select("#svg1")
      .attr("width", 400)
      .attr("height", 400);

    var group = canvas.append("g")
      .attr("transform", "translate(150, 150)");

    var r = 100;
    var p = Math.PI * 2;
    var score = 70;
    var finalScore = p * (70 / 100);

    var arc = d3.arc()
      .innerRadius(r)
      .outerRadius(80)
      .startAngle(0);

    group.append("path")
      .attr("fill", "orange")
      .transition()
      .ease(d3.easeLinear)
      .duration(2000)
      .attrTween("d", pieTween);

    group.append("text")
      .attr("text-anchor", "middle")
      .text(d3.format(".2f")(finalScore))

    function pieTween() {
      var i = d3.interpolate({
        endAngle: 0
      }, {
        endAngle: finalScore
      });
      return function(t) {
        return arc(i(t));
      };
    }

  </script>

</body>

关于javascript - 将文本和一些基本动画放在圆弧中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50963824/

相关文章:

javascript - 使用 jquery 获取/设置最后打开的 li 的索引

javascript - 如何强制 d3 的日期轴绘制未满的第一个月和最后一个月的刻度线[FIDDLE UPDATED]?

database - 深度可遍历的 self 中心图的缓存策略

javascript - 无法在 Javascript 中解析来自 SQL Server 的 JSON 日期

javascript - 如何将依赖项添加到我的 Spine 应用程序?

javascript - ES6 代理 : set() trap not triggering, 在目标对象的方法内部设置时

javascript - 返回数据的回调函数 - 使其匿名,函数还是模块?

javascript - 自定义 onclick 函数作为 Knockout SimpleGrid 中的属性

javascript - Bootstrap Tour 不记得我离开的地方

javascript - 标记 Sprite 不在 D3 强制布局中渲染