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

如何使用d3.js在sunburst旭日图中正常显示负数值对应扇区

d3.js旭日图负数切片隐藏解决方案

核心原因

d3.hierarchy的sum()方法默认计算节点权重时,会将负数作为0处理,对应节点的起始角度x0和结束角度x1相等,触发arcVisible方法中的d.x1 > d.x0判断不成立,因此切片被隐藏。同时你的示例数据中负数value是字符串类型,也会导致数值计算异常。

具体修改步骤

1. 重写partition计算逻辑

使用绝对值计算弧长权重,同时保留真实数值用于后续颜色、文本展示:

partition = data => {
    const root = d3.hierarchy(data)
        // 统一转数字格式,保存真实值,用绝对值计算弧长
        .sum(d => {
            d.actualValue = Number(d.value) || 0;
            return Math.abs(d.actualValue);
        })
        // 排序也按绝对值比较
        .sort((a, b) => Math.abs(b.actualValue) - Math.abs(a.actualValue));
    return d3.partition()
        .size([2 * Math.PI, root.height + 1])
        (root);
}

2. 调整颜色判断逻辑

使用预处理好的数值字段避免类型错误:

.attr('fill', function (d, i) {
    if (d.actualValue > 10) {
        return 'green'
    } else if (d.actualValue < 5 && d.actualValue >= 0) {
        return 'red'
    } else if (d.actualValue < 1) {
        return 'lightgreen'
    }
    return color(i)
})

3. 修正文本显示逻辑

展示真实数值:

.text(d => d.data.name + '\n' + d.actualValue);

4. 修复示例数据错误

删除data定义末尾多余的斜杠,可将字符串类型的负数值直接改为数字格式减少转换开销。
修改完成后所有节点都会按绝对值分配弧长,正负仅影响颜色和数值显示,不会再出现切片隐藏的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:27:00