Я только что обновил свою версию d3 с v4 до v6 и еще не внес изменений в способ рисования графиков. Раньше, когда минимальные и максимальные значения данных были равны 0, ось x при y = 0 устанавливалась в нижней части диаграммы, что я и пытаюсь сохранить. Теперь похоже, что d3 почему-то перемещает его в центр графика. v4 слева и v5 и v6 справа: введите описание изображения здесь введите здесь описание изображения Я также заметил это изменение при переходе с v4 на v5, но в журнале изменений я не могу найти ничего, что говорило бы об изменениях yScale, которые, как я считаю, являются их причиной. Это происходит только тогда, когда yScale.domain установлен в ([0,0]), но когда есть положительное или отрицательное значение, он правильно располагается внизу или вверху диаграммы, вот так.

enter image description here

Я искал повсюду и пытался изменить домены, но безуспешно. Кто-нибудь знает, что изменилось, или, возможно, другая идея, что попробовать дальше? Спасибо.

1
C. Short 12 Фев 2021 в 06:37

1 ответ

Лучший ответ

Это было осознанное решение (этот пользователь, mbostock , является создателем D3): https://github.com/d3/d3-scale/issues/117

В качестве быстрого исправления вы можете заранее проверить значения домена шкалы, если они совпадают, установите возвращаемое значение в начало диапазона:

const scale = d3.scaleLinear().domain([0, 0]).range([0, 10]);
const value = 0

//this is the current expected result
console.log(scale(value));

//check the domain values first
console.log(scale.domain()[0] === scale.domain()[1] ? scale.range()[0] : scale(value))
<script src="https://d3js.org/d3.v6.min.js"></script>

Поскольку у вас есть ось, зависящая от шкалы, лучшим решением было бы установить минимальное значение для конца шкалы, которое не равно нулю. Например:

scale.domain([0, d3.max(yourData) || minValue]);

Что будет оценивать ваш minValue, если d3.max(yourData) равно нулю.

2
Gerardo Furtado 15 Фев 2021 в 02:00