Который раз задаешь вопрос на одну и туже тему ?
1) d3.min(positiveChartPoints, d => new Date(d.date)).setMonth(-1), не правильно
Именно из-за этой строки у тебя пустая область и вылазит
Долно быть d3.min(positiveChartPoints, d => new Date(d.date))
С тиками
.ticks(2)
Вот это кусок кода заставляет d3 использовать свой генератор тиков и оно расставляет два тика равномерно на шкале. Для того, чтобы управлять размещением тиков, тебе нужно использовать tickValues
https://github.com/d3/d3-axis#axis_tickValues
В твоем случае примерно так
.axisBottom(xScale)
.tickValues([new Date("2018-12-02"), new Date("2019-04-30")])
.tickFormat(d3.timeFormat('%Y')))
Для того, чтобы динамически управлять расположением тиков, вместо массива вы можете передать в качестве аргумента функцию генератор, которая вым выдаст два равномерно расположенных тика в зависимости от вашего массива значений
https://codepen.io/casufi/pen/WNbbbXj