d3.js调用d3.timeDay.filter生成x轴刻度无限反向遍历问题
问题原因
1. 月份索引匹配错误
JS 原生Date对象的getMonth()返回值为0基:1月对应0,12月对应11。你设置的fiscal_year_ends_month = 10实际匹配的是11月,如果你要匹配10月,这个值应该调整为9。
如果你的x.domain()范围内恰好没有符合你设置的月份条件的日期,d3的时间刻度生成逻辑会不断向前后扩大搜索范围,直到凑够默认数量的刻度(通常是10个),这就会出现遍历到公元前的异常情况。
2. 重复调用ticks()方法覆盖配置
你连续调用了两次ticks(),后一次的参数会直接覆盖前一次的配置,你写的ticks(data.length < 60 ? d3.timeMonth : d3.timeYear)完全没有生效。
3. 可能存在domain未正确设置的问题
你贴出的x轴比例尺代码中只设置了rangeRound,没有显式设置domain,如果调用轴生成逻辑时x.domain()还没有被正确赋值,也会导致搜索范围异常。
解决方案
推荐直接手动生成符合要求的刻度值,用tickValues()传给轴,完全可控不会出现范围溢出问题:
// 第一步:先确保x比例尺的domain已经正确设置 x.domain([new Date(2002, 6, 31), new Date(2023, 6, 31)]) const fiscalMonth = 9 // 对应实际10月,根据你的财年结束月调整 const startYear = x.domain()[0].getFullYear() const endYear = x.domain()[1].getFullYear() const fiscalTicks = [] // 遍历年份生成所有符合条件的刻度 for (let year = startYear; year <= endYear; year++) { // 可自行调整刻度为当月的任意日期,这里示例取当月1日 const tickDate = new Date(year, fiscalMonth, 1) // 仅保留在domain范围内的日期 if (tickDate >= x.domain()[0] && tickDate <= x.domain()[1]) { fiscalTicks.push(tickDate) } } // 生成轴,直接用手动生成的刻度 const xAxis = d3.axisBottom(x) .tickFormat(d3.timeFormat("%m/%y")) .tickValues(fiscalTicks)
内容的提问来源于stack exchange,提问作者sveti petar
相关产品推荐
相关产品推荐

