D3.js v5雷达图无法渲染path对象问题求助
解决D3.js v5雷达图路径不显示的问题
我看到你的问题了——雷达轴线显示正常,但连接数据点的路径就是不出来,DOM里的radarStroke元素存在但d属性为空。这问题我之前也碰到过,核心原因是数据绑定方式错误,再加上角度计算没和轴线对齐,咱们一步步来修复:
问题1:数据绑定逻辑错误,给单个数据点创建了路径
你原来的代码里,data_area = g.selectAll('.radarWrapper').data(data)是把data数组里的每个对象单独绑定到一个radarWrapper元素上,等于生成了10个独立的g容器。每个容器里的path只能拿到单个数据对象(比如{axis: "1", value: 50}),但d3.lineRadial()需要的是完整的数据数组来生成整条闭合路径,单个对象自然生成不了有效路径,所以d属性为空。
问题2:路径角度和轴线角度不匹配
你的轴线角度计算是angle_slice*i - Math.PI/2(把0度调整到顶部方向),但路径的角度只写了i*angle_slice,这会导致数据点的位置和轴线错位,就算路径生成了也会显示在错误的地方。
修复后的核心代码
把路径相关的代码替换成下面这段:
// 问题区域修复 var radar_line = d3.lineRadial() .radius(function(d) { return r_scale(d.value); }) // 和轴线角度保持一致,将0度调整为顶部方向 .angle(function(d,i) { return i*angle_slice - Math.PI/2; }); // 将整个data数组作为单个数据项绑定,只生成一个radarWrapper容器 var data_area = g.selectAll('.radarWrapper') .data([data]) // 用[]把数组包起来,作为单个数据元素传入 .enter().append('g') .attr('class', 'radarWrapper'); data_area.append('path') .attr('class', 'radarStroke') .attr('d', function(d) { return radar_line(d); }) // 此时d是完整的data数组 .style('stroke-width', 2) .style('stroke', 'black') .style('fill', 'none');
额外检查项
为了确保万无一失,你可以再确认两个点:
angle_slice的计算是否正确:var angle_slice = 2 * Math.PI / all_axis.length;(10条轴的话,应该是2π/10 = π/5)max_value是否设置为100,和你的数据范围0-100对应,r_scale的定义域和值域配置正确。
这样修改后,路径应该就能正常渲染,而且数据点会精准对应到每条轴线上。
内容的提问来源于stack exchange,提问作者jpc
相关产品推荐
相关产品推荐

