在数据可视化项目中,折线图是最常见的图表类型之一,而通过颜色分段渐变可以让用户更加直观地感知数据的变化趋势和区间风险。本文将带你实战一个基于 Vue3 + ECharts 的 渐变分段折线图组件,支持传入 valueList
控制每段颜色,适配多种数据类型,实现图表的动态更新与响应式自适应。
一、效果预览与场景说明
该组件可应用于以下场景:
-
空气质量指标(AQI)
-
路况拥堵指数(如:0-0.5畅通,0.5-1一般,1-1.5拥堵,1.5以上严重拥堵)
-
用电/用水负荷情况
-
医疗风险评分、环境指标等变化趋势
图表每两个点之间自动生成一段颜色渐变,根据传入的 valueList
(或平均值)决定颜色样式,并自动适应窗口大小。
二、组件功能亮点
-
支持传入不同类型(
type
)自动切换分段区间和颜色; -
渐变分段颜色自动判断,视觉层次清晰;
-
使用
valueList
精细控制每段颜色; -
支持监听数据变化自动重绘;
-
使用
ResizeObserver
实现自适应窗口大小; -
可扩展性强,适合各种业务场景复用。
三、核心参数与结构说明
Props 参数
参数 | 类型 | 说明 |
---|---|---|
chartId | string | 图表 DOM 容器 ID |
height | string | 图表高度 |
type | string | 用于控制颜色区段逻辑 |
nameZ | string (可选) | X轴名称 |
nameY | string (可选) | Y轴名称 |
data | 对象 | 包含 values(y值数组) 和 xdata |
valueList | number[] (可选) | 控制每段颜色参考值 |
四、颜色分段策略设计
组件根据不同 type
类型使用不同的区间划分策略。你可以在 getSegmentsByType()
方法中自定义每种类型的分段逻辑与颜色。
例如:
case "19":
return [
{ range: [0, 0.5], colorFrom: "#e4d9d2", colorTo: "#f6bea4" },
{ range: [0.5, 1], colorFrom: "#f6bea4", colorTo: "#f08a6d" },
...
];
⚙️ 小技巧:每段区间的 colorFrom
到 colorTo
形成线性渐变,提供更平滑的视觉过渡。
五、核心逻辑详解
1. 获取当前段落对应的渐变色
根据每段的值匹配区间并返回对应的 echarts.graphic.LinearGradient
。
const getGradient = (val: number) => {
const segment = gradientSegments.value.find(
(seg) => val >= seg.range[0] && val < seg.range[1]
);
if (!segment) return "#000";
return new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{ offset: 0, color: segment.colorFrom },
{ offset: 1, color: segment.colorTo },
]);
};
2. 构造渐变折线段 Series
将每两个点构成一条线段,每条线段根据值计算颜色,最终形成多段渐变的折线图。
for (let i = 0; i < values.length - 1; i++) {
const val = referenceValues[i] ?? (y1 + y2) / 2;
const gradientColor = getGradient(val);
...
}
🎯 即使不传
valueList
,也会自动用相邻点的均值作为 fallback 值。
3. ECharts 初始化与配置
图表设置包括轴线、网格、tooltip 格式、颜色等,全部响应式更新。
const option = {
grid: { left: "25px", right: "35px", ... },
tooltip: { trigger: "axis", formatter: (params) => ... },
xAxis: { type: "category", data: props.data?.xdata || [] },
yAxis: { type: "value" },
series: generateGradientLineSeries(),
};
4. ResizeObserver 实现自适应
在 onMounted
中注册监听器,保证图表窗口尺寸变动时自动缩放。
resizeObserver = new ResizeObserver(() => {
chart?.resize();
});
六、响应式更新支持
组件使用 watch
监听多个关键属性变化,自动重新渲染图表。
watch(() => props.data, initChart, { deep: true });
watch(() => props.height, initChart);
watch(() => props.type, initChart);
watch(() => props.valueList, initChart);
这样在外部动态变更数据源或类型时,图表将自动重绘。
七、总结与优化建议
本折线图组件具备以下优势:
✅ 支持颜色分段、类型配置、外部数值控制
✅ 响应式渲染,兼容各种屏幕
✅ 渐变线段视觉美观,易于识别风险/异常区间
✅ 可复用性强,适用于多种业务数据场景
可扩展建议:
-
添加图例支持区段说明;
-
支持多线数据绘制;
-
支持切换线性/阶梯模式;
-
添加动态 tooltip 锚点样式优化。
<GradientLineChart chartId="line1" height="300px" type="19" :data="{ xdata: ['10:00', '10:05', '10:10', '10:15'], values: [0.3, 0.6, 1.2, 1.7], }" :valueList="[0.3, 0.5, 1.0]" nameZ="时间" nameY="指数值" />
如果你在实际项目中需要根据指标区间变化动态切换颜色展示,这个组件是非常实用的选择。如果你觉得有帮助,欢迎点赞收藏,也欢迎评论交流你的使用场景或改进建议!