Echarts基础图表 -- 散点图(气泡图)
2017-12-26 15:38:29 0
上次介绍了Echarts的雷达图,现在简单介绍下Echarts的散点图(气泡图)
首先,在使用Echarts时,要先引用Echarts,然后创建容器挂载绘制的图表,接着将当前容器传进去,创建Echarts实例,此处比较简单,往期也有,所以一律省略这个散点图(气泡图)
散点图主要用来展示二维或三维的数据,气泡图则可以理解成散点图的加强版,可以用来展示三维或四维的数据,甚至更多,维度上一般有x、y、z、面积、颜色、形状等 散点图(气泡图)一般用于表示因变量随自变量而变化的大致趋势,在数据点越多的时候,效果越明显 这里主要做一个展示三国时期势力发展的气泡图,效果如下图所示,数据非真实,主要涉及了标题组件(title)、提示框组件(tooltip)、直角坐标系组件(xAxis,yAxis)、坐标系网格组件(grid)、视觉映射组件(visualMap)、时间线组件(timeline)以及数据列组件(series)图-1-300x98.gif)
var data = {
'timeline':['184',...],
'subtext':['黄巾之乱',...],
'story':['184年 - 黄巾起义...','...',...],
'series':[[[30,10,'张角势力','张角',6,20],...], ...],// 数据维度,对应分别是势力总人口(x轴)、势力总兵力(y轴)、势力名称、势力君主、城池数、武将数
'counties':[['张角势力',...],...]
};
具体实现起来也比较简单,因为时间线组件提供了在多个Echarts option间进行切换、播放等操作的功能,所以我们可以根据时间来创建 echarts option,每个时间的option包含对应该时间的数据以及配置项,包括 subtext、story、series 以及 counties 等,然后通过时间线组件来联系这些 option,达到切换、播放的效果
对于一些公有配置或者是相同的配置,Echarts官方推荐我们放在一个基础的 option 中,因为 timeline 播放切换时,会把生成的 option 数组中对应的 option 与 基础的 option 进行 merge(合并) 形成最终的 option,因此,我们创建一个基础的 option,并在里面配置好配置项
baseOption: {
backgroundColor: '#404a59',
timeline: timeline,
title: title,
tooltip: tooltip,
grid: grid,
xAxis: xAxis,
yAxis: yAxis,
visualMap: visualMap,
series: series,
animationEasingUpdate: 'quinticInOut'
}
接下来是配置具体配置项,首先是时间线组件配置项,设置下时间轴的类型、位置、时间的顺序、播放的限制以及按钮、文本、线条等的样式
timeline: {
axisType: 'category', //时间轴为类目轴
orient: 'vertical', //垂直放置
inverse: true, //时间反转,默认不反转 垂直情况下 时间从上往下递减,反转则为递增
playInterval: 1000, //播放的时间间隔
autoPlay: true, //设置自动播放
top: 20,
bottom: 20,
right: 0,
width: 55,
symbol: 'none', //每个时间都有个点来标志,现在把点去掉
checkpointStyle: { //时间轴上当前选中项的样式
color: '#bbb',
borderColor: '#777',
borderWidth: 2
},
controlStyle: {//控制按钮的样式
showNextBtn: false,
showPrevBtn: false,
normal: {
color: '#666',
borderColor: '#666'
},
emphasis: {
color: '#aaa',
borderColor: '#aaa'
}
},
label: {//时间轴的文本标签样式
normal: {
textStyle: {
color: '#999'
}
},
emphasis: {
textStyle: {
color: '#fff'
}
}
},
lineStyle: {//线条样式
color: '#555'
},
data: []
}
然后是标题组件,这里用了三个标题组件,第一个是显示时间轴上的时间(即数据上的timeline属性的时间),第二个是显示重要的事件(即数据上的story),第三个则是整个图表的标题了
title: [{
text: data.timeline[0],
textAlign: 'center',
left: '78%',
top: '72%',
textStyle: {
fontSize: 40,
color: 'rgba(255, 255, 255, 0.7)'
}
},{
text: '重要事件',
subtext: data.story[0],
textAlign: 'left',
left: '20%',
top: '25%',
textStyle: {
fontSize: 12,
color: 'rgba(255, 255, 255, 0.8)'
},
subtextStyle: {
fontSize: 10,
color: 'rgba(255, 255, 255, 0.7)'
}
},{
text: '三国时期势力发展散点(气泡)图',
subtext: '数据非真实',
left: 'center',
top: 10,
textStyle: {
color: '#aaa',
fontWeight: 'normal',
fontSize: 20
}
}]
提示框组件,主要设置下提示框的样式
tooltip: {
padding: 10,
backgroundColor: '#f9f9f9',
borderColor: '#777',
borderWidth: 1,
textStyle: {
color: '#333',
fontWeight: 'normal',
fontSize: 18
}
}
网格组件、坐标系组件,只要对位置和坐标轴样式进行设置
grid: {
top: 100,
containLabel: true,//设置为true,防止标签溢出
left: 150,
right: 110
},
xAxis: {
type: 'log',
name: '势力总人口',
max: 1000,
min: 1,
nameGap: 25,
nameLocation: 'middle',
nameTextStyle: {
fontSize: 18
},
splitLine: {
show: false
},
axisLine: {
lineStyle: {
color: '#ccc'
}
},
axisLabel: {
formatter: '{value} 万人'
}
},
yAxis: {
type: 'value',
name: '势力总兵力',
min:1,
max: 60,
nameTextStyle: {
color: '#ccc',
fontSize: 18
},
axisLine: {
lineStyle: {
color: '#ccc'
}
},
splitLine: {
show: false
},
axisLabel: {
formatter: '{value} 万人'
}
}
视觉映射组件,使用分段型视觉映射组件,有三个配置比较重要,第一个是dimension,用来指定用数据的哪个维度,然后映射到视觉元素上,这里的dimension为2表示用上面的数据中的series内的第三个维度,也即是势力名称, 第二个是categories,这个是用来设置离散型数据的,会在组件上显示出来,有点类似于图例,这里设置的是势力名称,与dimension对应,第三个则是inRange,这个是用来定义在选中范围中的视觉元素,然后会使用里面定义的颜色,如 这里使用的是势力名称,那么在categories定义的势力名称则为选中范围的元素,如果dimension对应的series内的维度的数据不在该范围内,则不会使用inRange定义的颜色(而是使用outRange定义的颜色,outRange与inRange相反,他是 定义在选中范围外的视觉元素,本例子的视觉元素都会在视觉范围中,因此不设置outRange)
visualMap: [{
type:'piecewise',
dimension: 2,
categories: data.counties[0],
textGap: 30,
textStyle: {
color: '#ccc'
},
top: 'middle',
inRange: {
color: (function () {
var colors = ['#d48265', '#c23531','#6e7074', '#61a0a8', '#91c7ae','#749f83', '#ca8622', '#bda29a','#2f4554', '#546570', '#c4ccd3','#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'];
return colors.concat(colors);
})()
}
}]
最后就是数据列组件,主要是设置图表类型为散点图(气泡图),然后就是数据以及标记图形的样式
series: [{
type: 'scatter',
itemStyle: {
normal: {
opacity: 0.8,
shadowBlur: 10,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
},
data: data.series[0],
symbolSize: function(val) {
return sizeFunction(val[4]);//这个函数主要是将传入的值乘以8再返回,因为有些数值较小的数据直接放在图表上,会看不清,所以对整体数值在展示上进行放大
}
}],
接下来是设置整个图表的 option,这是最终传入 Echarts 的 option
option = {
baseOption: baseOption,
options:[]
};
至此,图表的所有准备工作都完成了,接下来就是生成timeline组件需要的option了,然后填充数据
for (var n = 0; n < data.timeline.length; n++) {
option.baseOption.timeline.data.push(data.timeline[n]);
option.options.push({
title: [{
text: data.timeline[n] + ' ' + data.subtext[n]
},{
text: '重要事件',
subtext: data.story[n]
}],
visualMap: [{
categories: data.counties[n]
}],
series: {
name: data.timeline[n],
data: data.series[n]
}
});
}
将配置项设置到Echarts实例上,然后运行一下,就可以看到结果了
myEcharts.setOption(option);