Ссылочный ответ правильный, у вас есть другие проблемы в вашем коде. Я также немного обновил этот ответ, чтобы очистить код и включить общий пример с осью 1600-2000.
Первая проблема заключается в том, что вы определяете свою шкалу х:
var x = d3.scaleTime().range([0, width]);
Затем сразу же определите вашу ось:
var xAxis = d3.axisBottom(x)
.tickFormat(timeFormat);
Затем вы определите домен x, переопределив также x:
var x = d3.scaleTime()
.domain(d3.extent(data, function(d) {return (d.dates);}))
.range([ 0, width ]);
Если мыиспользуйте svg.call(xAxis)
, это означает, что ось использует первый домен масштабов х, который по умолчанию равен [1 января 2000 г., 2 января 2000 г.], поэтому каждый тик будет иметь один и тот же год, если применить ось только с значением по умолчанию.domain.
Ваш код имеет .call(d3.axisBottom(x)
вместо .call(xAxis)
, что снова создает новую ось, но без форматирования, необходимого для отображения дат до 1900 года
Вместосначала определите домен масштаба, затем создайте ось:
var x = d3.scaleTime()
.range([0, width])
.domain(d3.extent(data, function(d) {return (d.dates);}))
var xAxis = d3.axisBottom(x)
.tickFormat(timeFormat);
И теперь вы можете просто применить ось:
selection
.attr("transform",...)
.call(xAxis);
Вот обновленный plunkr