如何使用我自己的颜色表而不是使用 d3 颜色集( interpolateviridis )来创建图例

Posted

技术标签:

【中文标题】如何使用我自己的颜色表而不是使用 d3 颜色集( interpolateviridis )来创建图例【英文标题】:How to use my own color table instead of using d3 color set ( interpolateviridis ) to create legend 【发布时间】:2021-12-15 13:26:43 【问题描述】:

我有以下一组颜色表,其中第一个数组中的第一个值是指点,接下来的 3 个值是 RGB 点。 例如:对于点 0.00,RGB 值应为 1.00、0.00、0.00。目前我正在为我的图例使用 d3 interpolateViridis 颜色,不建议这样做,我应该使用自己的点和颜色集。任何人都可以指导我。我还分享了我的代码的小提琴链接。

"colorsTable": [
    [ 0.00, 1.00, 0.00, 0.00 ],
    [ 0.25, 0.71, 0.71, 0.00 ],
    [ 0.50, 0.00, 1.00, 0.00 ],
    [ 0.75, 0.00, 0.71, 0.71 ],
    [ 1.00, 0.00, 0.00, 1.00 ]
]

// defining d3 color set
var colorScale2 = d3.scaleSequential(d3.interpolateViridis).domain([0,0.38]);

// calling function and passing values
continuous("#legend2", colorScale2);

function continuous(selector_id, colorscale) 
// defining canvas and so on
// main logic
var legendscale = d3.scaleLinear()
.range([0, legendheight - margin.top - margin.bottom])
.domain(colorscale.domain());

var image = ctx.createImageData(1, legendheight);
d3.range(legendheight).forEach(function(i) 
var c = d3.rgb(colorscale(legendscale.invert(i)));
image.data[4*i] = c.r;
image.data[4*i + 1] = c.g;
image.data[4*i + 2] = c.b;
image.data[4*i + 3] = 255;
);
ctx.putImageData(image, 0, 0);

小提琴链接:https://jsfiddle.net/um863e5o/3/

【问题讨论】:

【参考方案1】:

我可能误解了您的需求,但这应该能让您走上正轨。由于您的“值”是均匀分布的,因此您可以创建一个颜色数组,然后将其传递给d3.interpolateRgbBasis。然后,您可以使用此插值器创建具有所需域的色阶。

// create an array of the colors
const colors = colorsTable
  .map(([value, ...color]) => d3.rgb(...color.map(d => d * 255)));

// create color scale
const colorScale = d3.scaleSequential()
  .domain([0, .38])
  .interpolator(d3.interpolateRgbBasis(colors));

结果如下:

【讨论】:

以上是关于如何使用我自己的颜色表而不是使用 d3 颜色集( interpolateviridis )来创建图例的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以打印 rmarkdown 表而不丢失颜色?

QComboBox 文本颜色不会随样式表而改变

如何在 d3.js 中为颜色图例添加刻​​度线

d3.js 画笔填充颜色直方图

如何更改 d3js 图中图例的文本颜色?

d3.js使用Class和Attr为文本添加颜色