echarts图表折线图折线流动

本文档展示了如何使用JavaScript创建一个series-lines路径图,包括自定义x轴和y轴数据,配置流动特效、多段线样式,并生成了详细的示例数据结构。

效果展示:

  源码:


/**
 * series-lines路径图
 * @param xAxis 维度数据,如["测1", "测2", "测3", "测4", "测5", "测6", "测7", "测8"],
 * @param dataSet 指标数据 serise的value,如[90, 555, 666, 999, 567, 999, 888, 0]
 * @returns
 */
export const getSeriesLineEffect = (xAxis:any=[],dataSet:any=[],yAxisIndex:any=0,color='#fff')=>{
  let yData = dataSet,
  xData = xAxis,
  datacoords:any = [];
  if(xData.length){
    for (var i = 0; i < xData.length; i++) {
      datacoords.push([
        {
          coord: [i, yData[i]],
        },
        {
          coord: [i + 1, yData[i + 1]],
        },
      ]);
    };
  }
  let effect =  {
    type: "lines",
    // 流动特效只支持非平滑曲线(smooth:false)
    smooth: false,
    showSymbol: false,
    // 是否是多段线
    polyline: true,
    // 该系列使用的坐标系,可选:'cartesian2d'-使用二维的直角坐标系(也称笛卡尔坐标系),通过 xAxisIndex, yAxisIndex指定相应的坐标轴组件
    coordinateSystem: "cartesian2d",
    zlevel: 1,
    effect: {
      // 是否显示特效
      show: true,
      // 特效图形的标记
      smooth: true,
      // 特效动画的时间,单位为 s
      period: 6,
      // 特效标记的大小
      symbolSize: 4,
    },
    lineStyle: {
      color: color,
      width: 1,
      opacity: 0,
      curveness: 0,
      cap: "round",
    },
    // 使用的 y 轴的 index,在单个图表实例中存在多个 y轴的时候有用
    yAxisIndex :yAxisIndex,
    // 一个包含两个到多个二维坐标的数组
    data: datacoords,
  }
  return effect;
}

生成数据结构展示:

{
    "type": "lines",
    "smooth": false,
    "showSymbol": false,
    "polyline": true,
    "coordinateSystem": "cartesian2d",
    "zlevel": 1,
    "effect": {
        "show": true,
        "smooth": true,
        "period": 6,
        "symbolSize": 4
    },
    "lineStyle": {
        "color": "#fff",
        "width": 1,
        "opacity": 0,
        "curveness": 0,
        "cap": "round"
    },
    "data": [
        [
            {
                "coord": [
                    0,
                    "130396"
                ]
            },
            {
                "coord": [
                    1,
                    "129195"
                ]
            }
        ],
        [
            {
                "coord": [
                    1,
                    "129195"
                ]
            },
            {
                "coord": [
                    2,
                    "128497"
                ]
            }
        ],
        [
            {
                "coord": [
                    2,
                    "128497"
                ]
            },
            {
                "coord": [
                    3,
                    null
                ]
            }
        ]
    ]
}

 

### 实现 ECharts折线图的流光动态效果 为了实现在 ECharts 中展示多条折线图并带有流光动画效果的功能,可以借鉴 `anime.js` 库来增强视觉表现力。具体来说,可以通过自定义图形渲染逻辑以及利用 JavaScript 动画库实现这一目标。 #### 准备工作 首先引入必要的资源文件,包括 ECharts 和 anime.js: ```html <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script> ``` #### 初始化图表实例 接着初始化一个基本的 ECharts 折线图配置项,并加载到指定 DOM 容器内: ```javascript var chartDom = document.getElementById('main'); var myChart = echarts.init(chartDom); var option; option = { xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [ { name:'Series A', data:[120, 200, 150, 80, 70, 110, 130], type:'line' }, { name:'Series B', data:[100, 150, 200, 160, 90, 120, 140], type:'line' } ] }; myChart.setOption(option); ``` #### 添加流光特效处理 为了让每一条折线上都能呈现出流动光线的效果,可以在每次重绘时调用 `anime.js` 来控制线条颜色渐变的位置变化。下面是一个简单的例子说明如何修改上述代码以加入这种特殊样式[^3]: ```javascript // 获取所有系列的数据点坐标集合 function getPoints(seriesIndex){ let points = []; const serieData = myChart.getOption().series[seriesIndex].data; for(let i=0; i<serieData.length;i++){ var point = myChart.convertToPixel({seriesIndex}, [i, serieData[i]]); points.push(point); } return points; } let gradientOffset = 0; setInterval(() => { // 更新偏移量使颜色过渡平滑移动 gradientOffset += 0.01; if (gradientOffset >= 1) gradientOffset -= 1; // 遍历每一个序列应用新的渐变色 myChart.eachSeries(function (series) { const lineStyle = series.getData().getItemModel(0).getLineStyle(); // 创建线性渐变对象 const linearGradient = myChart._api.getZr().createLinearGradient( ...getPoints(series.seriesIndex)[Math.floor(getPoints(series.seriesIndex).length / 2)], false, [[gradientOffset, '#ff7f50'], [(gradientOffset + .5)%1, '#fff']] ); // 设置新样式给当前序列 lineStyle.stroke = linearGradient; }); // 刷新视图显示最新状态 myChart.render(); }, 16); // 每秒约60帧刷新率 ``` 这段脚本会在每一帧中计算出各条折线中间位置处的颜色停止点,并将其沿时间轴向前推进一小步,从而形成连续不断的色彩迁移现象。注意这里的颜色值可以根据实际需求自行设定。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值