一、图表类型
Echarts和Highcharts都支持各种类型的图表,如折线图、柱状图、散点图、雷达图等。
然而,Echarts支持的图表类型更多,如地图、热力图、饼图、漏斗图等。而Highcharts则对部分图表类型支持较少,如地图和3D图表。
以下是一个Echarts自定义饼图的示例:
// 引入 ECharts 主模块
var echarts = require('echarts/lib/echarts');
// 引入饼图模块
require('echarts/lib/chart/pie');
// 引入提示框和标题组件
require('echarts/lib/component/tooltip');
require('echarts/lib/component/title');
// 初始化图表实例
var myChart = echarts.init(document.getElementById('main'));
// 设置饼图的数据和配置项
var option = {
tooltip: {
trigger: 'item',
formatter: '{a}
{b}: {c} ({d}%)'
},
legend: {
orient: 'vertical',
left: 10,
data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']
},
series: [
{
name: '访问来源',
type: 'pie',
radius: ['50%', '70%'],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: '30',
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{value: 335, name: '直接访问'},
{value: 310, name: '邮件营销'},
{value: 234, name: '联盟广告'},
{value: 135, name: '视频广告'},
{value: 1548, name: '搜索引擎'}
]
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
二、性能
在大数据量的情况下,Echarts比Highcharts更具有优势。因为Echarts的底层使用了Canvas和SVG技术,渲染速度更快。
以下是一个用Echarts和Highcharts绘制10万数据点的折线图的示例,可以看出Echarts的渲染速度更快:
// 引入 ECharts 和 Highcharts
var echarts = require('echarts/lib/echarts');
var Highcharts = require('highcharts');
// 随机生成10万个随机数作为折线图的数据
var data = [];
for (var i = 0; i < 100000; i++) {
data.push(Math.random());
}
// 使用 Echarts 绘制折线图
var start1 = Date.now();
var myChart1 = echarts.init(document.getElementById('main1'));
var option1 = {
xAxis: {
type: 'category',
data: data.map(function (item, index) {
return index;
})
},
yAxis: {
type: 'value'
},
series: [{
data: data,
type: 'line'
}]
};
myChart1.setOption(option1);
console.log('Echarts time:', Date.now() - start1);
// 使用 Highcharts 绘制折线图
var start2 = Date.now();
Highcharts.chart('main2', {
chart: {
zoomType: 'x'
},
xAxis: {
type: 'category',
tickInterval: 10000,
labels: {
formatter: function () {
return this.value / 1000 + 'k';
}
}
},
yAxis: {
title: {
text: 'Value'
}
},
legend: {
enabled: false
},
plotOptions: {
area: {
fillColor: {
linearGradient: {
x1: 0,
y1: 0,
x2: 0,
y2: 1
},
stops: [
[0, Highcharts.getOptions().colors[0]],
[1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
]
},
marker: {
radius: 2
},
lineWidth: 1,
states: {
hover: {
lineWidth: 1
}
},
threshold: null
}
},
series: [{
type: 'area',
data: data
}]
});
console.log('Highcharts time:', Date.now() - start2);
三、数据可视化
除了绘制静态的图表外,Echarts和Highcharts还提供了数据可视化的功能。
Echarts可以在地图上显示气泡,以表示不同城市的数据情况;Highcharts可以在柱状图上显示动态的进度条,以表示某一项任务的完成情况。
以下是一个Echarts在地图上显示气泡的示例:
// 引入 ECharts 主模块和地图组件
var echarts = require('echarts/lib/echarts');
require('echarts/lib/chart/map');
// 初始化图表实例
var myChart = echarts.init(document.getElementById('main'));
// 配置地图和气泡的数据
var option = {
legend: {
orient: 'vertical',
left: 'left',
data:['销量']
},
tooltip: {
trigger: 'item',
showDelay: 0,
transitionDuration: 0.2,
formatter: function (params) {
var value = (params.value + '').split('.');
value = value[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, '$1,')
+ '.' + value[1].substr(0, 2);
return params.seriesName + '
' + params.name + ': ' + value;
}
},
visualMap: {
min: 0,
max: 1000,
left: 'left',
top: 'bottom',
text: ['高','低'], // 文本,默认为数值文本
calculable: true
},
series: [
{
name: '销量',
type: 'map',
mapType: 'china',
roam: false,
itemStyle:{
normal:{
label:{
show:true
}
},
emphasis:{
label:{
show:true
}
}
},
data:[
{name: '北京', value: Math.round(Math.random()*1000)},
{name: '天津', value: Math.round(Math.random()*1000)},
{name: '上海', value: Math.round(Math.random()*1000)},
{name: '重庆', value: Math.round(Math.random()*1000)},
{name: '河北', value: Math.round(Math.random()*1000)},
{name: '河南', value: Math.round(Math.random()*1000)},
{name: '云南', value: Math.round(Math.random()*1000)},
{name: '辽宁', value: Math.round(Math.random()*1000)},
{name: '黑龙江', value: Math.round(Math.random()*1000)},
{name: '湖南', value: Math.round(Math.random()*1000)},
{name: '安徽', value: Math.round(Math.random()*1000)},
{name: '山东', value: Math.round(Math.random()*1000)},
{name: '新疆', value: Math.round(Math.random()*1000)},
{name: '江苏', value: Math.round(Math.random()*1000)},
{name: '浙江', value: Math.round(Math.random()*1000)},
{name: '江西', value: Math.round(Math.random()*1000)},
{name: '湖北', value: Math.round(Math.random()*1000)},
{name: '广西', value: Math.round(Math.random()*1000)},
{name: '甘肃', value: Math.round(Math.random()*1000)},
{name: '山西', value: Math.round(Math.random()*1000)},
{name: '内蒙古', value: Math.round(Math.random()*1000)},
{name: '陕西', value: Math.round(Math.random()*1000)},
{name: '吉林', value: Math.round(Math.random()*1000)},
{name: '福建', value: Math.round(Math.random()*1000)},
{name: '贵州', value: Math.round(Math.random()*1000)},
{name: '广东', value: Math.round(Math.random()*1000)},
{name: '青海', value: Math.round(Math.random()*1000)},
{name: '西藏', value: Math.round(Math.random()*1000)},
{name: '四川', value: Math.round(Math.random()*1000)},
{name: '宁夏', value: Math.round(Math.random()*1000)},
{name: '海南', value: Math.round(Math.random()*1000)},
{name: '台湾', value: Math.round(Math.random()*1000)},
{name: '香港', value: Math.round(Math.random()*1000)},
{name: '澳门', value: Math.round(Math.random()*1000)}
]
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
四、主题
Echarts和Highcharts都支持自定义主题,并且都内置了多种主题可供选择。
然而,Echarts比Highcharts更容易自定义主题,因为Echarts的配置项中有专门的theme字段,可以方便地进行主题切换。
以下是一个Echarts自定义主题的示例:
// 引入 ECharts 主模块
var echarts = require('echarts/lib/echarts');
// 引入折线图模块
require('echarts/lib/chart/line');
// 引入主题
require('echarts/theme/macarons');
// 初始化图表实例
var myChart = echarts.init(document.getElementById('main'), 'macarons');
// 设置折线图的数据和配置项
var option = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [{
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: 'line'
}]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
五、跨平台
对于跨平台的需求, Echarts和Highcharts都提供了基于JavaScript和HTML5的方案,支持PC端和移动端,可以在多种浏览器和设备上使用。
以下是一个Echarts和Highcharts在移动端显示折线图的示例,可以看出两者的显示效果和交互方式略有不同:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
<title>Echarts vs Highcharts</title>
<!-- 引入 ECharts 和 Highcharts -->
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.1.1/echarts.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
</head>
<body>
<div id="chart1" style="width: 100%; height: 300px;"></div>
<script>
// 使用 ECharts 绘制折线图
var myChart1 = echarts.init(document.getElementById('chart1'));
var option1 = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [{
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: 'line'
}]
};
myChart1.set