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

如何使用D3.js v4为SVG圆形添加四等分填充分段

解决D3.js v4将SVG圆形分为4个均等彩色分段的问题

我来帮你搞定这个把SVG圆形拆成4个均等彩色分段的需求~核心思路是用D3的d3.arc()生成扇形路径,把4个90度的扇形拼起来就是完整的圆,每个扇形可以单独设置颜色。下面是具体的实现步骤:

1. 准备分段数据

先定义4个分段的角度范围和对应颜色,每个分段占90度(也就是Math.PI/2弧度):

const segmentData = [
  { startAngle: 0, endAngle: Math.PI / 2, color: "#ff6b6b" }, // 右上区域
  { startAngle: Math.PI / 2, endAngle: Math.PI, color: "#4ecdc4" }, // 左上区域
  { startAngle: Math.PI, endAngle: 3 * Math.PI / 2, color: "#ffe66d" }, // 左下区域
  { startAngle: 3 * Math.PI / 2, endAngle: 2 * Math.PI, color: "#1a535c" } // 右下区域
];

2. 创建弧生成器

用d3.arc()创建扇形生成器,设置内半径(0,因为我们要实心圆)、外半径(你的圆的目标半径):

const arcGenerator = d3.arc()
  .innerRadius(0)
  .outerRadius(20) // 这里替换成你实际需要的圆半径
  .cornerRadius(0); // 不需要圆角就设0,想要圆角可以填数值比如3

3. 替换原有圆形绘制逻辑

你原来的代码里应该是用<circle>元素绘制family类型的节点,现在把这部分换成绘制4个扇形路径。假设你已经有节点组node,可以这样写:

// 筛选出family类型的节点,绘制分段
node.filter(d => d.type === 'family')
  .each(function(d) {
    const group = d3.select(this);
    // 因为节点组已经通过transform属性定位,扇形用相对坐标(0,0)即可跟随节点移动
    group.selectAll(".family-segment")
      .data(segmentData)
      .enter()
      .append("path")
      .attr("class", "family-segment")
      .attr("d", arcGenerator) // 用弧生成器生成扇形路径
      .attr("fill", seg => seg.color); // 给每个分段设置对应颜色
  });

为什么不用<circle>?

<circle>是单一的SVG元素,没办法直接拆分成分段并单独上色。而d3.arc()生成的<path>元素可以灵活定义扇形的角度范围,4个扇形拼起来正好是完整的圆,完美满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:40:38