Я думаю, что ваша проблема в том, что вы передаете все даты в одномерном массиве. Вместо того, чтобы иметь
var myData = [new Date(2020, 3, 1), new Date(2020, 6, 1)];
, как вы делаете для кругов, у вас должно быть что-то вроде этого:
var myRecData = [ {"startDate": new Date(2020, 3, 1), "endDate": new Date(2020, 6, 1)}, {"startDate": new Date(2020, 4, 1), "endDate": ....];
И затем доступ это с d.startDate
и d.endDate
РЕДАКТИРОВАТЬ:
На основе вашего последнего комментария я воссоздал весь код ( для будущих вопросов, пожалуйста, добавьте полный Воспроизводимый код, поэтому люди, которые хотят помочь вам, могут быстро его протестировать ... ):
<body>
<div id="mainDiv"></div>
<script>
const width = 500
const height = 500
const axes_svg = d3.select("#mainDiv").append("svg")
.attr("viewBox", [0,0, width, height])
.attr("width", "100%")
.attr("height", "100%")
let scale = d3.scaleTime()
//.domain([d3select.min(data), d3select.max(data)])
.domain([new Date(2020, 0, 1), new Date(2021, 0, 1)])
.range([20, width - 200]);
let x_axis = d3.axisBottom(scale)
.scale(scale);
axes_svg.append("g")
.call(x_axis);
var myData = [new Date(2020, 3, 1), new Date(2020, 6, 1)];
axes_svg
.selectAll('circle')
.data(myData)
.enter()
.append('circle')
.style("fill", "#69b3a2")
.attr('r', 6)
.attr('cy', 40)
.attr('cx', function (d) {
return scale(d);
});
var testdata = [{ start: new Date(2020, 1, 1), close: new Date(2020, 3, 1) }];
axes_svg
.data(testdata)
.append("rect")
.style("fill", "#00abff")
.attr("x", function (d) { return scale(d.start); })
.attr("y", 80) //distance from axis
.attr("width", function (d) { return scale(d.close) - scale(d.start); })
.attr("height", 30); //height
</script>
</body>