D3.js中在现有折线图上层绘制恒定阈值线的问题求解
问题原因
- 第一处错误:
x1属性直接传入了完整的xExtent数组,实际应该取数组第一个值作为线段的x轴起点原始值 - 第二处核心错误:手动创建
line元素时没有调用你绘制折线时定义的X/Y比例尺做数值到画布像素的转换。折线绘制时lineGenerator已经内置了你配置的比例尺逻辑会自动转换数值,但单独创建SVG图形元素需要手动调用比例尺完成转换 - 如果你设置的
y1/y2的1.5是y轴的原始数值而非画布像素坐标,同样没有经过比例尺转换会导致位置错误
解决方案
假设你绘制折线时定义的x轴比例尺为xScale、y轴比例尺为yScale,参考线对应的y轴恒定阈值为thresholdY = 1.5,修改代码如下:
svg .append('line') // x轴起点:x最小原始值转像素坐标 .attr('x1', xScale(xExtent[0])) // y轴起点/终点:恒定阈值转像素坐标 .attr('y1', yScale(thresholdY)) // x轴终点:x最大原始值转像素坐标 .attr('x2', xScale(xExtent[1])) .attr('y2', yScale(thresholdY)) .attr('stroke', '#000') .attr('stroke-width', 1.5) // 可选配置:添加虚线样式区分阈值线 .attr('stroke-dasharray', '4 2');
如果参考线本身不需要对齐y轴数值,仅需要固定在画布对应像素位置,直接修改x1取值为xExtent[0]即可解决线段长度错误的问题。
层级说明
保证上述参考线的绘制代码写在原有折线绘制代码之后,SVG默认后插入的元素层级更高,就会显示在折线上层。
内容的提问来源于stack exchange,提问作者Oh Great One
相关产品推荐
相关产品推荐

