Мне кажется, это проблема XY .Насколько я могу сказать, вам не нужно <mask>
или что-то подобное.Все, что вам нужно, это заполнить кружки в соответствии со значением в каратах, которое идет от 0 до 3.
При этом, и, поскольку ваша цветовая последовательность, вероятно, interpolateViridis , я предлагаю вам просто использоватьпоследовательная шкала ...
const colorScale = d3.scaleSequential(d3.interpolateViridis)
.domain([0, 3]);
... и заполните свои круги согласно значению в каратах (здесь, свойство x
):
circleSelection.style("fill", d => colorScale(d.x))
Вот демонстрационная версия:
const svg = d3.select("svg");
const data = d3.range(120).map(function(d, i) {
return {
y: 14*d3.easeCubic(i/120) + (Math.random()*(6*i/120)),
x: i / 40
}
});
const yScale = d3.scaleLinear()
.range([280, 20])
.domain([0, 20]);
const xScale = d3.scaleLinear()
.range([30, 480])
.domain([0, 3]);
const colorScale = d3.scaleSequential(d3.interpolateViridis)
.domain([0, 3]);
const circles = svg.selectAll(null)
.data(data)
.enter()
.append("circle")
.attr("r", 6)
.attr("cx", d => xScale(d.x))
.attr("cy", d => yScale(d.y))
.style("stroke", "dimgray")
.style("fill", d => colorScale(d.x));
svg.append("g")
.attr("transform", "translate(30,0)")
.call(d3.axisLeft(yScale))
svg.append("g")
.attr("transform", "translate(0,280)")
.call(d3.axisBottom(xScale))
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg width="500" height="300"></svg>