You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何为D3.js环形图添加角度标签

给D3.js环形图添加角度标签解决方案

没问题!我来帮你实现环形图的角度标签功能。咱们可以通过计算每个圆弧的中间角度,来定位标签并调整旋转方向,让标签完美贴合圆弧的角度。

修改后的完整代码

下面是调整好的可运行代码,我主要修改了标签部分的逻辑,同时保留了你原来的圆弧样式:

<!DOCTYPE html>
<html>
<head>
    <style>
        body {
            font: 10px sans-serif;
        }
        .arc path {
            stroke: #fff;
        }
        text {
            font-size: 12px;
            fill: #333;
        }
    </style>
</head>
<body>
    <div id="donut"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.3.0/d3.min.js"></script>
    <script>
        var width = 300, height = 300, radius = Math.min(width, height) / 2;
        var color = d3.scale.ordinal()
          .range(["#6fc9e1", "#00627d", "#179bbf"]);
        
        // 保留你原来的圆弧定义
        var biggestarc = d3.svg.arc()
          .outerRadius(radius - 100)
          .innerRadius(radius - 60);
        var bigarc = d3.svg.arc()
          .outerRadius(radius - 100)
          .innerRadius(radius - 50);
        var smallarc = d3.svg.arc()
          .outerRadius(radius - 100)
          .innerRadius(radius - 40);
        
        var pie = d3.layout.pie()
          .sort(null)
          .value(function (d) { return d.percent; });
        
        var svg = d3.select("#donut").append("svg")
          .attr("width", width)
          .attr("height", height)
          .append("g")
          .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
        
        data = [{ "label": "Biggest", "percent": 33 }, { "label": "Big", "percent": 17 }, { "label": "Small", "percent": 50 }]
        
        var g = svg.selectAll(".arc")
          .data(pie(data))
          .enter().append("g")
          .attr("class", "arc");
        
        // 绘制圆弧(保留你的原有逻辑)
        g.append("path")
          .attr("d", function (d) {
            if (d.data.label == "Biggest") {
              return biggestarc(d);
            } else if (d.data.label == "Big") {
              return bigarc(d);
            } else {
              return smallarc(d);
            }
          })
          .style("fill", function (d) { return color(d.data.label); });
        
        // 添加角度标签的核心逻辑
        g.append("text")
          .attr("transform", function(d) {
            // 先获取当前弧的中间角度(弧度转角度)
            var midAngle = d.startAngle + (d.endAngle - d.startAngle) / 2;
            // 计算标签的位置:在弧的外侧,比outerRadius远20px的位置
            var labelRadius = radius - 30; // 根据你的圆弧大小调整这个值
            var x = Math.cos(midAngle) * labelRadius;
            var y = Math.sin(midAngle) * labelRadius;
            // 同时设置旋转角度,让文字和圆弧角度匹配
            var rotateAngle = (midAngle * 180 / Math.PI);
            // 处理角度大于180度时文字倒置的问题,翻转180度让文字正立
            if (midAngle > Math.PI) rotateAngle += 180;
            return "translate(" + x + "," + y + ") rotate(" + rotateAngle + ")";
          })
          .attr("text-anchor", "middle")
          .text(function(d) { 
            // 计算并显示角度值(百分比转角度:percent * 3.6)
            var angle = Math.round(d.data.percent * 3.6);
            return angle + "°"; 
          });
    </script>
</body>
</html>

关键修改说明

  • 角度计算:通过d.startAngle和d.endAngle计算圆弧的中间角度,把弧度转换成角度用于旋转标签。
  • 标签定位:用三角函数计算标签在圆弧外侧的位置,你可以通过调整labelRadius的值来控制标签离圆弧的距离。
  • 文字方向修正:当中间角度大于π(180度)时,把文字旋转180度,避免文字倒置,保证可读性。
  • 角度值转换:把百分比转换成对应的角度(因为一圈是360度,所以百分比乘以3.6就是角度值)。

你可以直接运行这段代码,就能看到每个圆弧外侧显示对应的角度标签啦!

内容的提问来源于stack exchange,提问作者iLaYa ツ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:25:59