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

使用d3.interpolateViridis实现连续颜色图例时刻度域值显示异常

问题原因

d3的axis.ticks()方法仅用于传入刻度生成的参考值,D3为了保证刻度间隔均匀、可读性高,会自动调整实际生成的刻度值,不会严格遵循传入的刻度数量,也不会默认强制展示domain的首尾值。另外你的代码存在变量名拼写不一致问题:你定义的色阶变量是colorScale2,但后续生成legendscale时调用的是colorscale.domain(),大小写不匹配会导致domain取值异常,需要先修正。

解决方案

方案1:仅展示首尾两个刻度(匹配你的需求)

直接用tickValues()方法强制指定刻度为domain的首尾值,适配动态变化的domain:

// 修正变量名拼写错误
var legendscale = d3.scaleLinear()
.range([0, legendheight - margin.top - margin.bottom])
.domain(colorScale2.domain());
        
// 轴配置改用tickValues强制取domain两端值
var legendaxis = d3.axisRight()
.scale(legendscale)
.tickSize(16)
.tickValues(legendscale.domain()); // 替换原来的.ticks(2)

方案2:保留自动生成的中间刻度,同时强制展示首尾值

如果需要同时显示中间刻度和首尾的精确domain值,可以合并自动生成的刻度和domain值后去重排序:

var autoTicks = legendscale.ticks(3); // 可调整参数控制中间刻度数量
var finalTicks = [...autoTicks, ...legendscale.domain()]
  .sort((a, b) => a - b)
  // 去重,避免首尾值和自动刻度重叠
  .filter((val, idx, arr) => idx === 0 || Math.abs(val - arr[idx-1]) > 1e-6);

var legendaxis = d3.axisRight()
.scale(legendscale)
.tickSize(16)
.tickValues(finalTicks);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:48:03