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

如何将数据库数值转换为0-2区间百分比用于D3.js弧形绘制?

D3.js弧形项目百分比计算方案

核心计算逻辑

  • 计算数据库获取的四个数值总和
  • 基于总和算出每个数值的占比,再乘以最大为2的缩放系数(保证四个perc总和不超过2)
  • 将计算结果赋值给perc1至perc4

动态计算perc的代码实现

替换原代码中硬编码的perc值,改为从数据库数值动态计算:

// 从数据库获取的示例数值
const values = [129, 53, 111, 95];
// 计算数值总和
const totalValue = values.reduce((acc, val) => acc + val, 0);
// 缩放系数,最大设为2,确保perc总和不超过2
const scaleFactor = 2;
// 生成对应perc值
const [perc1, perc2, perc3, perc4] = values.map(val => (val / totalValue) * scaleFactor);

// 可选:调试时验证总和,应接近2
console.log('perc总和:', perc1 + perc2 + perc3 + perc4);

完整整合后的代码

将动态计算逻辑嵌入原D3.js弧形生成代码:

var totalPercent = .75;
var padRad = 0.025;
var percToRad = function (perc) {
    return degToRad(percToDeg(perc));
};
var degToRad = function (deg) {
    return deg * Math.PI / 180;
};
var percToDeg = function (perc) {
    return perc * 360;
};

// 从数据库获取的示例数值
const values = [129, 53, 111, 95];
const totalValue = values.reduce((acc, val) => acc + val, 0);
const scaleFactor = 2;
const [perc1, perc2, perc3, perc4] = values.map(val => (val / totalValue) * scaleFactor);

//****Set up the arc generator*****
var next_start = totalPercent;

arcStartRad = percToRad(next_start);
arcEndRad = arcStartRad + percToRad(perc1 / 4);
next_start += perc1 / 4;
const arc1 = d3.arc().innerRadius(innerRadius).outerRadius(outerRadius).startAngle(arcStartRad).endAngle(arcEndRad);

arcStartRad = percToRad(next_start);
arcEndRad = arcStartRad + percToRad(perc2 / 4);
next_start += perc2 / 4;
const arc2 = d3.arc().innerRadius(innerRadius).outerRadius(outerRadius).startAngle(arcStartRad + padRad).endAngle(arcEndRad);

arcStartRad = percToRad(next_start);
arcEndRad = arcStartRad + percToRad(perc3 / 4);
next_start += perc3 / 4;
const arc3 = d3.arc().innerRadius(innerRadius).outerRadius(outerRadius).startAngle(arcStartRad + padRad).endAngle(arcEndRad);

arcStartRad = percToRad(next_start);
arcEndRad = arcStartRad + percToRad(perc4 / 4);
next_start += perc4 / 4;
const arc4 = d3.arc().innerRadius(innerRadius).outerRadius(outerRadius).startAngle(arcStartRad + padRad).endAngle(arcEndRad);

补充说明

  • 缩放系数设为2时,四个perc的总和刚好等于2,完全满足限制条件
  • 若需要缩短弧形总长度,可减小缩放系数(如1.5),此时perc总和会相应降低,仍符合要求
  • 使用reduce和map处理数值,代码简洁且易于维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:38