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

如何在D3.js中实现domain为颜色集合、range为颜色子集的色阶

D3.js 同色系子色值生成实现方案

核心思路

结合D3内置的比例尺和颜色处理工具即可实现需求,无需额外依赖。核心逻辑是先把输入的标准色转到HSL色彩空间,通过调整亮度、饱和度参数生成同色系子色集合,再用序数比例尺做标准色到子色集合的映射。

具体实现步骤

  • 第一步:定义基础配置项,可根据业务需求自行调整参数
import { scaleOrdinal, hsl } from 'd3';

// 子色亮度、饱和度调整规则,数值可以根据实际显示效果修改
const SHADE_OFFSET = {
  dark: { l: -0.2, s: 0.05 }, // 深色调:亮度降低20%,饱和度微升
  light: { l: 0.2, s: -0.05 } // 浅色调:亮度提升20%,饱和度微降
}

// 你的业务标准色列表,可按需扩展
const STANDARD_COLORS = [
  "#FF0000", // 红
  "#00FF00", // 绿
  "#0000FF", // 蓝
  "#FFFF00"  // 黄
];
  • 第二步:封装子色生成逻辑,绑定到D3比例尺
// 输入标准基准色,返回同色系子色数组
function generateShades(baseColor) {
  const baseHsl = hsl(baseColor);
  return [
    // 深色调
    hsl(
      baseHsl.h, 
      Math.max(0, Math.min(1, baseHsl.s + SHADE_OFFSET.dark.s)), 
      Math.max(0, Math.min(1, baseHsl.l + SHADE_OFFSET.dark.l))
    ).formatHex(),
    // 原始基准色
    baseColor,
    // 浅色调
    hsl(
      baseHsl.h, 
      Math.max(0, Math.min(1, baseHsl.s + SHADE_OFFSET.light.s)), 
      Math.max(0, Math.min(1, baseHsl.l + SHADE_OFFSET.light.l))
    ).formatHex()
  ]
}

// 构建标准色到子色集合的映射比例尺
const colorScale = scaleOrdinal()
  .domain(STANDARD_COLORS)
  .range(STANDARD_COLORS.map(color => generateShades(color)));

// 对外暴露的调用函数,shadeIndex对应子色层级:0=深、1=原始、2=浅
function getSubColor(baseColor, shadeIndex = 0) {
  const shades = colorScale(baseColor);
  // 兜底逻辑:如果输入的基准色不在预设列表里,直接返回原始色
  return shades ? shades[shadeIndex] : baseColor;
}

使用示例

// 传入标准绿色,默认返回深绿色
console.log(getSubColor("#00FF00")); // 输出示例:#009900

// 传入标准绿色,指定返回浅绿色
console.log(getSubColor("#00FF00", 2)); // 输出示例:#66FF66

如果需要更多同系子色,只要调整generateShades函数里的亮度、饱和度参数,增加返回数组的长度即可。如果需要给不同标准色配置不同的子色规则,也可以单独为每个标准色设置自定义的offset参数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:27:01