You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:24:04