Highcharts与ECharts在大数据量下的使用与比较

业务需求

对百万级数据点进行绘制

Highcharts实现

使用Highcharts的Boost 模块实现该功能。Boost 模块由 WebGL 而不是默认的 SVG来实现图表的渲染,从而在几毫秒内呈现数十万个数据点。除了 WebGL 渲染之外,它还通过尽可能跳过数据的处理和检查来节省时间,但这可能导致在启用 Boost 模块后一些其他功能存在一些限制。

引入依赖项

javascript 复制代码
import Highcharts from "highcharts";
import boost from "highcharts/modules/boost";
boost(Highcharts)

关键配置项

javascript 复制代码
Highcharts.chart('container', {
    boost: {
      useGPUTranslations: true
    },
});

完整代码

javascript 复制代码
<template>
  <div id="app">
    <div id="container"></div>
  </div>
</template>

<script>
import Highcharts from "highcharts";
import boost from "highcharts/modules/boost";
boost(Highcharts)

export default {
  name: 'App',
  mounted () {
     this.getChart();
  },
  methods: {
    getChart(){
      var n = 1000000,
      data = this.getData(n);// 获取数据
      console.time('line');
      Highcharts.chart('container', {
        boost: {
          useGPUTranslations: true
        },
        title: {
          text: 'Highcharts drawing ' + n + ' points'
        },
        subtitle: {
          text: 'Using the Boost module'
        },
        tooltip: {
          valueDecimals: 2
        },
        series: [{
          data: data,
          lineWidth: 0.5
        }]
      });
      console.timeEnd('line');
    },
    getData(n) {
      var arr = [], i, a, b, c, spike;
      for (i = 0; i < n; i = i + 1) {
        if (i % 100 === 0) {
          a = 2 * Math.random();
        }
        if (i % 1000 === 0) {
          b = 2 * Math.random();
        }
        if (i % 10000 === 0) {
          c = 2 * Math.random();
        }
        if (i % 50000 === 0) {
          spike = 10;
        } else {
          spike = 0;
        }
        arr.push([i, 2 * Math.sin(i / 100) + a + b + c + spike + Math.random()]);
      }
      return arr;
    },
  }
}
</script>
<style>
.container{
  width: 400px;
  height: 400px;
}
</style>

效果图

数据渲染耗时:

ECharts实现

使用large属性启用大规模路径图的优化。是否开启大数据量优化,在数据图形特别多而出现卡顿时候可以开启。开启后配合 largeThreshold 在数据量大于指定阈值的时候对绘制进行优化。

缺点:优化后不能自定义设置单个数据项的样式。

引入依赖项

javascript 复制代码
import * as echarts from 'echarts';

关键配置项

javascript 复制代码
config =  {
    series: [
          {
            type: 'line',
            data: this.ydata,
            large: true
          }
      ]
};

完整代码

javascript 复制代码
<template>
  <div id="app">
    <div id="container"></div>
  </div>
</template>

<script>
import * as echarts from 'echarts';

export default {
  name: 'App',
  data () {
    return {
      xdata:[],
      ydata:[],
    }
  },
  mounted () {
     this.getEChart();
  },
  methods: {
    getECharts(){
      var n = 1000000,
      this.getData(n);// 获取数据
      console.time('echartsline');
      let EChart = echarts.init(document.getElementById("EChart"));
      let config = {
        title: { text: 'Echarts drawing ' + n + ' points' },
        tooltip: {
            trigger: 'axis'
        },
        xAxis: {
            silent: false,
            data:this.xdata
        },
        yAxis: {},
        series: [
          {
            type: 'line',
            data: this.ydata,
            large: true
          }
        ],
        
      };
      EChart.setOption(config);
      console.timeEnd('echartsline');
    },
    getData(n) {
      var arr = [], i, a, b, c, spike;
      for (i = 0; i < n; i = i + 1) {
        if (i % 100 === 0) {
          a = 2 * Math.random();
        }
        if (i % 1000 === 0) {
          b = 2 * Math.random();
        }
        if (i % 10000 === 0) {
          c = 2 * Math.random();
        }
        if (i % 50000 === 0) {
          spike = 10;
        } else {
          spike = 0;
        }
        arr.push([i, 2 * Math.sin(i / 100) + a + b + c + spike + Math.random()]);
        this.xdata.push(i);
        this.ydata.push(arr[i][1]);
      }
      return arr;
    },
  }
}
</script>
<style>
.container{
  width: 400px;
  height: 400px;
}
</style>

效果图

渲染时间对比

1w 20w 50w 100w 200w
Highcharts(折线图-1条) 106.7 ms 304.1 ms 1004.7 ms 1459.8 ms 2359.1 ms(tooltip几乎无延迟)
ECharts(折线图-1条) 66.1 ms 449.7 ms (tooltip卡顿) 1200.7 ms(tooltip卡顿) 2030.0 ms(tooltip卡顿) 4529.7 ms(tooltip卡顿)
Highcharts(折线图-5条) 151.5 ms 1082.6 ms 3205.9 ms 4734.0 ms -
ECharts(折线图-5条) 109.4 ms 1780.4 ms 4800.5 ms 10812.4 ms (25s) -
Highcharts(柱状图) 142.1 ms 480.5 ms 1012.4 ms 1521.5 ms 5869.1 ms
ECharts(柱状图) 54.2 ms 194.3 ms 339.9 ms 681.0 ms 449.7 ms

折线图:单条折线图时Highcharts与ECharts渲染时间在10w数据时基本持平,但ECharts在此数据量下tooltip仍然会出现卡顿的情况。10条折线时,15w数据量下,两者渲染时间基本持平,但ECharts在1.8w数据量时tooltip出现明显卡顿

柱状图:ECharts渲染时间远优于Highcharts

注

此demo使用版本:

json 复制代码
{
    "node": "^12.20.0",
    "highcharts": "^11.2.0",
    "echarts": "^5.0.0",
}
相关推荐
腾讯数据架构师21 小时前
任务跑完怎么直接出图表?CubeStudio 任务可视化 ECharts 数据格式实操(CSV/JSON + metric.json,11 种图表一键渲染)
前端·json·echarts·数据可视化
总要学点什么2 天前
第81篇:数据可视化-PM2.5分布——让圆点的胖瘦替每座城市报出浓度
前端·信息可视化·echarts·cesium·空间分析
paopaokaka_luck2 天前
社区服务平台(加权协同过滤推荐、Jieba中文词频分析、WebSocket实时聊天、求助处理闭环、 活动积分闭环、ECharts多维分析)
java·前端·spring boot·mysql·echarts·mybatis
mmsx2 天前
Android 并发考古:newThread 与 RxJava 共存,以及 GlobalScope 的三宗罪
android·echarts·rxjava
DataGear3 天前
DataGear 6.1.1 发布,数据可视化分析平台
javascript·信息可视化·数据分析·echarts·数据可视化
paopaokaka_luck3 天前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
半生过往4 天前
智慧园区数字孪生大屏总结
echarts·three.js
Highcharts.js5 天前
2026年,AI正在重写技术:“工具思维”正在失效?
人工智能·echarts·客户端·highcharts·可视化图表·企业级图表
paopaokaka_luck5 天前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
paopaokaka_luck6 天前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节