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

将D3.js v3带提示框的堆叠柱状图迁移至v4遇问题求助

D3.js v3 堆叠代码转 v4 解决方案

嘿,我来帮你搞定这个堆叠柱状图的版本迁移问题!D3 v4 对布局模块做了不小的改动,d3.layout.stack() 这个旧API被彻底重构了,我给你把代码转好,再详细说下改动点:

转换后的 v4 代码

// 1. 创建堆叠生成器,指定要堆叠的水果字段
var stackGenerator = d3.stack()
  .keys(["redDelicious", "mcintosh", "oranges", "pears"])
  .value(function(d, key) { return +d[key]; }); // 定义如何读取每个字段的数值

// 2. 生成堆叠数据,并转换成你需要的结构
var dataset = stackGenerator(data)
  .map(function(layer) {
    return layer.map(function(d) {
      // 保留解析后的年份x值,同时处理stack生成的y0(基线高度)和y(当前层高度)
      return {
        x: parse(d.data.year),
        y0: d[0],
        y: d[1] - d[0]
      };
    });
  });

关键改动说明

  • API 结构变化:D3 v4 移除了旧的 d3.layout.stack(),改用 d3.stack() 创建「堆叠生成器」,这是v4模块化重构后的标准写法,所有布局类API都改成了这种生成器模式。
  • 数据处理简化:v3里需要手动把每个水果字段转成独立的{x,y}数组,v4里直接用 .keys() 指定要堆叠的字段名,生成器会自动帮你处理数据分层,不用再写外层的map循环啦。
  • 堆叠值的结构变化:v4的stack处理后,每个数据项是[y0, y1]的数组(y0是该层的基线高度,y1是层顶高度),所以我们需要把它转成你原来代码依赖的x、y0、y(当前层的高度)结构,这里用d[1] - d[0]得到当前层的高度。

这样转换后,你的dataset结构就和v3版本的完全一致了,后续的比例尺、绘图代码应该就能正常运行啦。

内容的提问来源于stack exchange,提问作者SurangiT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:18:24