如何在D3.js中基于deviationFromAvg属性动态设置线条描边颜色?
问题:D3.js中根据数据属性为线条分段设置不同颜色
你能正常绘制线条,但尝试根据deviationFromAvg属性改变线条颜色时,始终只应用数组第一个元素的颜色;用随机颜色时整根线也只有一种随机色。
问题原因
你用了.datum(fooData)把整个数据数组绑定到单个path元素上:
- stroke的回调函数只会执行一次(因为只有一个path),此时参数
d是完整的fooData数组,i是0,所以d[i]永远取第一个元素的值 - D3的path元素本身只能设置单一颜色,无法直接给同一根path的不同线段分配不同颜色
解决方案
要实现分段上色,需要把整条线拆成相邻点组成的多个小段,每个小段对应一个独立的path元素,再给每个小段设置对应颜色:
- 预处理数据:将原数据转换为相邻点对的数组,每个元素包含两个连续数据点,用于绘制一段线条
- 绑定分段数据:用
.data()绑定处理后的数组,生成多个path元素 - 为每个线段设置颜色:根据对应数据点的
deviationFromAvg属性设置stroke颜色
代码示例
// shape of data // fooData = Array<{ // value: number; // deviationFromAvg: number; // }> var leftLine = d3.line() .x(function(d, i) { return x(i); }) .y(function(d) { return y(d.value); }); // 预处理数据:生成相邻点对的数组 const segmentData = fooData.slice(0, -1).map((d, i) => [d, fooData[i+1]]); updateNode.selectAll("path") .data(segmentData) .enter() .append("path") .style("fill", "none") .style("stroke", function(d) { // 用当前线段的起始点(或终点)的deviationFromAvg判断颜色 const dataPoint = d[0]; if(dataPoint.deviationFromAvg > 0) return "red" else if(dataPoint.deviationFromAvg < 0) return "green"; else return "blue" }) .style("stroke-width", 1.5) .attr("d", leftLine);
补充说明
- 若要基于线段终点的属性设置颜色,只需把
dataPoint = d[0]改成dataPoint = d[1] - 随机颜色的场景下,每个path的stroke回调会独立执行,所以每个小段会有不同的随机色
内容的提问来源于stack exchange,提问作者FlavorScape
相关产品推荐
相关产品推荐

