Как вы знаете, такого метода не существует.Кроме того, само понятие пропускной способности (которая не несет никакой информации) для линейного масштаба имеет мало смысла.
Но интересный вопрос о вашем вопросе заключается в том, что речь идет не о линейной шкале как таковой, а о оси , сгенерированной с использованием этой шкалы (как вы сказали "...при условии, что вы установили отметки на оси ").
В D3 ось, генерируемая при использовании шкалы, довольно непредсказуема (то есть количество отметок и их значения), особенно когдаиспользуя шкалу времени.Кроме того, вы можете изменить тики, используя axis.ticks()
или axis.tickArguments()
.Из-за этого использование scale.ticks()
для получения значений тиков не является точным методом.
При этом вы можете использовать функцию, которой вы передаете саму группу осей (SVG <g>
).элемент), как этот, который я только что написал:
function tickWidth(selection) {
const ticks = selection.selectAll(".tick text")
.nodes()
.map(function(d) {
return +d.textContent;
});
return scale(ticks[1]) - scale(ticks[0]);
}
В основном он получает все элементы <text>
внутри групп .ticks
, преобразовывает их в числа (они являются строками) и возвращает разницув масштабе.
Вот демоверсия:
const svg = d3.select("svg");
const scale = d3.scaleLinear()
.range([50, 450])
.domain([0, 100]);
const axis = d3.axisBottom(scale);
const axisGroup = svg.append("g")
.attr("transform", "translate(0,50)")
.call(axis);
const bandwidth = tickWidth(axisGroup);
console.log("the bandwidth is: " + bandwidth + " pixels")
function tickWidth(selection) {
const ticks = selection.selectAll(".tick text").nodes().map(function(d) {
return +d.textContent;
});
return scale(ticks[1]) - scale(ticks[0]);
}
<svg width="500" height="100"></svg>
<script src="https://d3js.org/d3.v5.min.js"></script>
Как видите, этот подход учитывает такие методы, как axis.ticks()
, которые изменяют тики:
const svg = d3.select("svg");
const scale = d3.scaleLinear()
.range([50, 450])
.domain([0, 100]);
const axis = d3.axisBottom(scale)
.ticks(5);
const axisGroup = svg.append("g")
.attr("transform", "translate(0,50)")
.call(axis);
const bandwidth = tickWidth(axisGroup);
console.log("the bandwidth is: " + bandwidth + " pixels")
function tickWidth(selection) {
const ticks = selection.selectAll(".tick text").nodes().map(function(d) {
return +d.textContent;
});
return scale(ticks[1]) - scale(ticks[0]);
}
<svg width="500" height="100"></svg>
<script src="https://d3js.org/d3.v5.min.js"></script>