【问题标题】:In Javascript / D3, how to map colorscale of 5 colors (hex format) to 17 colors在 Javascript/D3 中,如何将 5 种颜色(十六进制格式)的色阶映射到 17 种颜色
【发布时间】:2019-07-30 21:53:06
【问题描述】:

假设我有 javascript 数组 ['#1147FF', '#86D8FF', '#FFEF67', '#FF7D11', '#F30000']。如果我转到这个颜色scales website here,然后从5步到17步点击,它会输出'#1147ff','#4f6cff','#6990ff','#7bb4ff','#86d8ff','#b4dddb','#d3e3b7','#ebe991','#ffef67','#ffd453','#ffb83f','#ff9b2a','#ff7d11','#fd6a0b','#fa5405','#f73902','#f30000',这本质上就是我想要的色阶。

有没有办法只使用 6-hex 十六进制值来完成这项工作?我目前正在使用一种可怕的方法,将十六进制值转换为 rgb 值,然后循环 rgb 值(下面是我所指的粗略示例,忽略变量名中的green):

    green0pct = { r: 17, g: 71, b: 255 };
    green7p5pct = { r: 134, g: 216, b: 255 };
    green15pct = { r: 252, g: 233, b: 70 };
    green22p5pct = { r: 255, g: 125, b: 17 };
    green30pct = { r: 243, g: 0, b: 0 };

    for (let j = 0; j <= 30; j++) {
        if (j % 2 === 0) {
            if (j < 7.5) {
                newR = green0pct.r - (j * (green0pct.r - green7p5pct.r) / 7.5);//
                newG = green0pct.g - (j * (green0pct.g - green7p5pct.g) / 7.5);
                newB = green0pct.b - (j * (green0pct.b - green7p5pct.b) / 7.5);
            } else if (j < 15) {
                newR = green7p5pct.r - ((j - 7.5) * (green7p5pct.r - green15pct.r) / 7.5);
                newG = green7p5pct.g - ((j - 7.5) * (green7p5pct.g - green15pct.g) / 7.5);
                newB = green7p5pct.b - ((j - 7.5) * (green7p5pct.b - green15pct.b) / 7.5);
            } else if (j < 22.5) {
                newR = green15pct.r - ((j - 15) * (green15pct.r - green22p5pct.r) / 7.5);
                newG = green15pct.g - ((j - 15) * (green15pct.g - green22p5pct.g) / 7.5);
                newB = green15pct.b - ((j - 15) * (green15pct.b - green22p5pct.b) / 7.5);
            } else {
                newR = green22p5pct.r - ((j - 22.5) * (green22p5pct.r - green30pct.r) / 7.5);
                newG = green22p5pct.g - ((j - 22.5) * (green22p5pct.g - green30pct.g) / 7.5);
                newB = green22p5pct.b - ((j - 22.5) * (green22p5pct.b - green30pct.b) / 7.5);
            }
            displayPct = playerOrTeam === 'Team' ? (j - 15) / 2 : j - 15;
            greenScale.push({ text: `${displayPct}%`, col: `rgb(${newR},${newG},${newB})` });
        }}

【问题讨论】:

    标签: javascript d3.js colors


    【解决方案1】:

    一种选择是使用 d3-interpolator:

    d3.interpolateRgbBasis(颜色)

    通过 指定的颜色数组,将其转换为 RGB 颜色空间。 生成隐式控制点,使得插值器 在 t = 0 时返回颜色 [0],在 t = 1 时返回颜色 [colors.length - 1]。(source)

    在最基本的情况下,您可以根据颜色数组和插值器生成一个包含 n 个颜色的新列表:

    // Starting colors:
    var colors = ['#1147FF', '#86D8FF', '#FFEF67', '#FF7D11', '#F30000'];
    
    // Create an interpolator:
    var interpolate = d3.interpolateRgbBasis(colors);
    
    // Make 17 new colors: 
    var n = 17;
    var newColors = d3.range(n).map(function(d) {
      return interpolate(d/(n-1));  // d/(n-1) will range from 0 through 1
    })
    

    这是一个演示:

    var colors = ['#1147FF', '#86D8FF', '#FFEF67', '#FF7D11', '#F30000'];
    var interpolate = d3.interpolateRgbBasis(colors);
    
    var n = 17;
    var newColors = d3.range(n).map(function(d) {
      return interpolate(d/(n-1));
    })
    
    console.log(newColors);
    
    d3.select("svg")
      .selectAll("rect")
      .data(newColors)
      .enter()
      .append("rect")
      .attr("fill", function(d) { return d; })
      .attr("width", 10)
      .attr("height",10)
      .attr("x", function(d,i) {
        return i*12;
      })
      .attr("y", 20);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
    <svg></svg>

    【讨论】:

    • 这太棒了。我还意识到我可以简单地创建一个域 [1, 5, 9, 13, 17] 和范围 ['#1147FF', '#86D8FF', '#FFEF67', '#FF7D11', '#F30000'] 的线性刻度,并使用它来生成我需要的任何颜色。也喜欢这个回复
    猜你喜欢
    • 1970-01-01
    • 2021-04-19
    • 2019-06-16
    • 2021-03-08
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2016-12-19
    • 2013-10-28
    相关资源
    最近更新 更多