У меня есть линейный график в d3. Ось X - это даты. Я хочу немного увеличить экстенты, чтобы первая и последняя точки данных не попадали прямо в первую и последнюю дату на графике. Вот пи c графика:
Обратите внимание, как первая точка данных и последняя точка данных находятся в начале и в конце диаграммы? Я хотел бы иметь небольшой запас с обеих сторон, так как самая маленькая дата должна быть немного меньше, а самая большая дата должна быть немного больше. Есть ли простой способ расширить экстенты?
Вот способ, которым он в настоящее время создается:
x.domain(d3.extent(data, function(d) { return d.date; }));
РЕДАКТИРОВАТЬ: Дата является динамической c и может быть несколько дней или несколько десятилетий. Я надеюсь на ответ, который смотрит на диапазон дат и добавляет примерно на 5% больше к каждому концу. Также, пожалуйста, предоставьте решение, которое не зависит от добавления другой библиотеки, которая может конфликтовать с существующими библиотечными функциями.
Например, приведенное ниже решение Герардо зависит от добавления дополнительной библиотеки, чтобы заставить работать функцию подсчета. Но это мешает функции оси позже в коде.
Единственный способ заставить работать следующий код:
const minDate = new Date("October 10, 2010");
const maxDate = new Date("January 31, 2020");
const daysBetween = d3.timeDay.count(minDate,maxDate);
- включить эту библиотеку:
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
Но это приводит к сбою следующего кода, который будет использован позже:
var xAxis = d3.svg.axis()
.scale(x)
.ticks(d3.time.years,1)
.tickSize(10)
.orient("bottom");
Это моя попытка найти решение. Я получаю минимальную и максимальную дату из экстентов, конвертирую их в миллисекунды, затем вычитаю 5% из минимума, добавляю 5% к максимальному, затем устанавливаю новые экстенты:
var xSpan = maxTime - minTime;
console.log("maxTime=" +maxTime +", minTime=" +minTime +", xSpan="+xSpan);
xMarg = xSpan * 0.05;
xMarg = xMarg.toFixed(0); //nearest millisecond
console.log("xMarg="+xMarg);
var minDate = new Date(minTime-xMarg);
var maxDate = new Date(maxTime+xMarg);
console.log("minDate="+minDate +", maxDate="+maxDate);
x.domain([minDate,maxDate]);
Но вывод maxDate показывает ошибку:
maxTime = 1580454000000, minTime = 1288332000000, xSpan = 292122000000 xMarg = 14606100000 minDate = ср. 12 мая 2010 22:45:00 GMT-0600 (горное дневное время), maxDate = Invalid Дата