将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
相关产品推荐
相关产品推荐

