Масштаб полосы предполагает, что каждый элемент данных представлен чем-то, имеющим ширину, например столбец в гистограмме. Ширина масштабированного пространства (полосы) для этого элемента составляет от xBandScale(value)
до xBandScale(value) + xBandScale.bandwidth()
. Это удобно тем, что позволяет установить значение x прямоугольника на xBandScale(value)
и ширину на xBandScale.bandwidth()
.
Но если вы располагаете круги, вы хотите, чтобы они были по центру в середине этого пространства. Вы позиционируете свои очки с помощью xScale(value)
, который является левой стороной полосы:
![enter image description here](https://i.stack.imgur.com/v1rAs.png)
Тики оси смещены, потому что они предполагают ширину полосы, после чего мы передаем масштаб полосы на генератор оси.
Да, вы можете расположить свои круги с помощью:
.attr("cx", function(d) { return xScale(d.someProperty) + xScale.bandwidth()/2 })
Это поместит круг в середину полосы, которая выровняет ваши круги по отметкам вашей оси. Но ваша линия не будет начинаться с вертикальной оси, и на самом деле это не целевое назначение масштаба полосы, даже если оно работает.
Вместо этого мы могли бы попробовать d3.scalePoint
- который также является порядковым масштабом и похож на масштаб диапазона. В документе указано: «Точечные шкалы обычно используются для диаграмм рассеяния с порядковым или категориальным измерением». Они идеальны, когда у вас есть объекты, которые не имеют ширины (или, точнее, расположены в середине полосы).
С этим мы получаем график, который выглядит так (используя те же данные и структуру, что и выше):
![enter image description here](https://i.stack.imgur.com/HO3Jd.png)
Обратите внимание, что интервал между точками равен xScale.step()
, отметки перемещены (также, последний шаг превышает линию оси - это только для иллюстрации, ось заканчивается в d).
Наконец, если у нас есть ось, которая представляет что-то вроде времени или какую-то другую непрерывную величину, мы можем использовать любую непрерывную шкалу в d3, а не порядковую шкалу, которая часто может быть предпочтительнее.
Для простоты я предполагаю, что нет отступов, чтобы облегчить чтение изображений