todo:
缩放
5 分钟上手 ECharts
获取 ECharts
你可以通过以下几种方式获取 ECharts。
- 从官网下载界面选择你需要的版本下载,根据开发者功能和体积上的需求,我们提供了不同打包的下载,如果你在体积上没有要求,可以直接下载完整版本。开发环境建议下载源代码版本,包含了常见的错误提示和警告。
- 在 ECharts 的 GitHub 上下载最新的
release
版本,解压出来的文件夹里的dist
目录里可以找到最新版本的 echarts 库。 - 通过 npm 获取 echarts,
npm install echarts --save
,详见“在 webpack 中使用 echarts” - cdn 引入,你可以在 cdnjs,npmcdn 或者国内的 bootcdn 上找到 ECharts 的最新版本。
引入 ECharts
ECharts 3 开始不再强制使用 AMD 的方式按需引入,代码里也不再内置 AMD 加载器。因此引入方式简单了很多,只需要像普通的 JavaScript 库一样用 script 标签引入。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!-- 引入 ECharts 文件 --> <script src="echarts.min.js"></script> </head> </html>
绘制一个简单的图表
在绘图前我们需要为 ECharts 准备一个具备高宽的 DOM 容器。
<body> <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM --> <div id="main" style="width: 600px;height:400px;"></div> </body>
然后就可以通过 echarts.init 方法初始化一个 echarts 实例并通过 setOption 方法生成一个简单的柱状图,下面是完整代码。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ECharts</title> <!-- 引入 echarts.js --> <script src="echarts.min.js"></script> </head> <body> <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="width: 600px;height:400px;"></div> <script type="text/javascript"> // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById(‘main‘)); // 指定图表的配置项和数据 var option = { title: { text: ‘ECharts 入门示例‘ }, tooltip: {}, legend: { data:[‘销量‘] }, xAxis: { data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] }, yAxis: {}, series: [{ name: ‘销量‘, type: ‘bar‘, data: [5, 20, 36, 10, 10, 20] }] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); </script> </body> </html>
这样你的第一个图表就诞生了!
你也可以直接进入 ECharts Gallery 中查看编辑示例
http://echarts.baidu.com/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%20ECharts
异步数据加载和更新
异步加载
入门示例中的数据是在初始化后setOption
中直接填入的,但是很多时候可能数据需要异步加载后再填入。ECharts
中实现异步数据的更新非常简单,在图表初始化后不管任何时候只要通过 jQuery 等工具异步获取数据后通过 setOption
填入数据和配置项就行。
var myChart = echarts.init(document.getElementById(‘main‘)); $.get(‘data.json‘).done(function (data) { myChart.setOption({ title: { text: ‘异步数据加载示例‘ }, tooltip: {}, legend: { data:[‘销量‘] }, xAxis: { data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] }, yAxis: {}, series: [{ name: ‘销量‘, type: ‘bar‘, data: [5, 20, 36, 10, 10, 20] }] }); });
或者先设置完其它的样式,显示一个空的直角坐标轴,然后获取数据后填入数据。
var myChart = echarts.init(document.getElementById(‘main‘)); // 显示标题,图例和空的坐标轴 myChart.setOption({ title: { text: ‘异步数据加载示例‘ }, tooltip: {}, legend: { data:[‘销量‘] }, xAxis: { data: [] }, yAxis: {}, series: [{ name: ‘销量‘, type: ‘bar‘, data: [] }] }); // 异步加载数据 $.get(‘data.json‘).done(function (data) { // 填入数据 myChart.setOption({ xAxis: { data: data.categories }, series: [{ // 根据名字对应到相应的系列 name: ‘销量‘, data: data.data }] }); });
如下:
ECharts 中在更新数据的时候需要通过name
属性对应到相应的系列,上面示例中如果name
不存在也可以根据系列的顺序正常更新,但是更多时候推荐更新数据的时候加上系列的name
数据。
loading 动画
如果数据加载时间较长,一个空的坐标轴放在画布上也会让用户觉得是不是产生 bug 了,因此需要一个 loading 的动画来提示用户数据正在加载。
ECharts 默认有提供了一个简单的加载动画。只需要调用 showLoading 方法显示。数据加载完成后再调用 hideLoading 方法隐藏加载动画。
myChart.showLoading(); $.get(‘data.json‘).done(function (data) { myChart.hideLoading(); myChart.setOption(...); });
数据的动态更新
ECharts 由数据驱动,数据的改变驱动图表展现的改变,因此动态数据的实现也变得异常简单。
所有数据的更新都通过 setOption实现,你只需要定时获取数据,setOption 填入数据,而不用考虑数据到底产生了那些变化,ECharts 会找到两组数据之间的差异然后通过合适的动画去表现数据的变化。
ECharts 3 中移除了 ECharts 2 中的 addData 方法。如果只需要加入单个数据,可以先 data.push(value) 后 setOption
具体可以看下面示例:
var base = +new Date(2014, 9, 3); var oneDay = 24 * 3600 * 1000; var date = []; var data = [Math.random() * 150]; var now = new Date(base); function addData(shift) { now = [now.getFullYear(), now.getMonth() + 1, now.getDate()].join(‘/‘); date.push(now); data.push((Math.random() - 0.4) * 10 + data[data.length - 1]); if (shift) { date.shift(); data.shift(); } now = new Date(+new Date(now) + oneDay); } for (var i = 1; i < 100; i++) { addData(); } option = { xAxis: { type: ‘category‘, boundaryGap: false, data: date }, yAxis: { boundaryGap: [0, ‘50%‘], type: ‘value‘ }, series: [ { name:‘成交‘, type:‘line‘, smooth:true, symbol: ‘none‘, stack: ‘a‘, areaStyle: { normal: {} }, data: data } ] }; setInterval(function () { addData(true); myChart.setOption({ xAxis: { data: date }, series: [{ name:‘成交‘, data: data }] }); }, 500);
ECharts 实现地图散点图(上)
ECharts 作为国内应用最广泛的前端可视化生成工具,提供了丰富的图表展现方式和便捷的图表操作。 ECharts 支持 geoJson 格式的地图,并且官网上提供了现成的 world,china 及全国34个省市自治区地图的下载。这篇文章中我们将会讲解如何使用 ECharts 实现一个中国地图上绘制的散点图。
一、初始准备
1. 新建html
首先,新建项目目录 echartsMapDemo,在其中新建一个 html 文件 index.html
。
echartsMapDemo/index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ECharts map Demo</title> </head> <body> </body> </html>
2.引入echarts文件
从 echarts官网 下载最新完整开发包(目前最新版本是3.1.4)。
将下载好的包放置在 echartsMapDemo/dep
目录下并在 html 中以 script 标签引入:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ECharts map Demo</title> </head> <body> </body> <script src="/dep/echarts.min.js"></script> </html>
3.创建图标容器
在 html 中定义一个 div 作为地图的容器,高度设为 500px 。别忘了,一定要保证容器高度不为 0:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ECharts map Demo</title> </head> <body> <div id="map-wrap" style="height: 500px;"> <!-- 这里以后是地图 --> </div> </body> <script src="/dep/echarts.min.js"></script> </html>
然后,我们还需要一个地图文件,echart 提供两种格式的地图数据,一种是 js 格式,一种是 JSON 格式。下文中我们会分别使用这两种方式实现。
同样去 官网 上下载,这里选择下载中国地图 china.js 或 china.json 。你也可以根据需要选择其他省份地图或世界地图
好了,准备工作完成,现在就开始绘制地图了~
二、绘制地图
echart 提供两种格式的地图数据,一种是 js 格式,一种是 JSON 格式。下面分别介绍两种格式的用法:
引用js格式地图数据:
1.在官网上下载 js 格式中国地图 china.js,将下载好的 china.js 放在 echartsMapDemo/map/js
目录下,以 script 标签引入到 html 中:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ECharts map Demo</title> </head> <body> <div id="map-wrap" style="height: 500px;"> <!-- 这里以后是地图 --> </div> </body> <script src="/dep/echarts.min.js"></script> <script src="/map/js/china.js"></script> </html>
2.在js中用 echarts.init()
方法初始化一个 ECharts 实例,在 init() 中传入图表容器 Dom 对象,
同时定义一个变量 option
,作为图表的配置项:
// 初始化echarts示例mapChart var mapChart = echarts.init(document.getElementById(‘map-wrap‘)); // mapChart的配置 var option = { };
3.通过配置 option,新建一个地理坐标系 geo
,地图类型为中国地图。
var option = { geo: { map: ‘china‘ } }
geo.map 属性定义该地理坐标系中的地图数据,这里我们要用 china.js ,设置map值为 ‘china’。
这里需要注意,中国地图的map值为 ‘china’ ,世界地图的map值为 ‘world’ ,但如果要引用省市自治区地图 map 值为简体中文,例如 beijing.js,map 值为’北京’。
4.调用 setOption(option)
为图表设置配置项。
mapChart.setOption(option);
引用JSON格式地图数据:
1.同样在官网下载JSON格式的地图数据,放在echartsMapDemo/map/json
目录下
2.json数据通过异步方式加载,加载完成后需要手动注册地图
这里我们使用 jQuery 的 $.get() 方法异步加载 china.json (首先要在html中引用 jquery ,这里省略操作说明),在回调函数中,以上述同样的方法初始化一个 mapCharts 、注册地图并设置 option:
$.get(‘map/json/china.json‘, function (chinaJson) { echarts.registerMap(‘china‘, chinaJson); // 注册地图 var mapChart = echarts.init(document.getElementById(‘map-wrap‘)); var option = { geo: { map: ‘china‘ } } mapChart.setOption(option); }); });
现在就可以在页面中看到中国地图了:
为了突出散点效果,先为地图改个颜色
var option = { geo: { map: ‘china‘, itemStyle: { // 定义样式 normal: { // 普通状态下的样式 areaColor: ‘#323c48‘, borderColor: ‘#111‘ }, emphasis: { // 高亮状态下的样式 areaColor: ‘#2a333d‘ } } }, backgroundColor: ‘#404a59‘, // 图表背景色 }
换装后的地图:
三、绘制散点图
1.新建散点图series
在 option 中添加一个 series , series 的类型为散点图 scatter
,坐标系为地理坐标系 geo
。
var option = { geo: { ... }, backgroundColor: ‘#404a59‘, series: [ { name: ‘销量‘, // series名称 type: ‘scatter‘, // series图表类型 coordinateSystem: ‘geo‘ // series坐标系类型 } ] }
2.添加数据
ECharts 中 series.data 是定义图表数据内容的数组,其中每个项数据格式为:
{ name: ‘北京‘, // 数据项名称,在这里指地区名称 value: [ // 数据项值 116.46, // 地理坐标,经度 39.92, // 地理坐标,纬度 340 // 北京地区的数值 ] }
首先我们将需要渲染的数据转换成上述数据格式,存在一个变量中:
var myData = [ {name: ‘海门‘, value: [121.15, 31.89, 90]}, {name: ‘鄂尔多斯‘, value: [109.781327, 39.608266, 120]}, {name: ‘招远‘, value: [120.38, 37.35, 142]}, {name: ‘舟山‘, value: [122.207216, 29.985295, 123]}, ... ]
然后,将 myData 赋值给 series.data:
var option = { geo: { ... }, backgroundColor: ‘#404a59‘, series: [ { name: ‘销量‘, type: ‘scatter‘, coordinateSystem: ‘geo‘, data: myData // series数据内容 } ] }
数据添加完成,就可以在图表中看到渲染出的散点了:
3.添加视觉映射组件
视觉映射组件是标识某一数据范围内数据及颜色对应关系的控件,视觉映射组件分为连续型和分段型,这里我们选用连续型 type:continuous
。同时,通过视觉映射组件可以实现 ECharts 值域漫游功能,即通过拖拽控件手柄选择不同数值范围,达到对图表数据的筛选显示。 在 visualMap
属性中设置值域控件的相关配置:
var option = { ... visualMap: { type: ‘continuous‘, // 连续型 min: 0, // 值域最小值,必须参数 max: 200, // 值域最大值,必须参数 calculable: true, // 是否启用值域漫游 inRange: { color: [‘#50a3ba‘,‘#eac736‘,‘#d94e5d‘] // 指定数值从低到高时的颜色变化 }, textStyle: { color: ‘#fff‘ // 值域控件的文本颜色 } } }
添加了值域控件的图表效果:
这样一个基于中国地图的散点图就基本实现了,如果想要继续完善图表,可以为它添加标题,图例,高亮提示等控件,配置方式在这里查看(ECharts 配置项手册),在此不再详细说明。
http://echarts.baidu.com/blog/2016/04/28/echarts-map-tutorial.html
上一篇我们介绍了如何使用 ehcarts 内置地图实现地图上绘制的散点图,这篇中,我们将讲解如何在百度地图上绘制散点图。
一、初始准备
首先要创建 html 和引入 ECharts 包,具体说明详见上篇:ECharts 实现地图散点图(一)。
二、引入echarts百度地图扩展包
在 github 上下载 ECharts 扩展 bmap.js,放在 /extension/ 目录下,并引入 html 中:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ECharts map Demo</title> </head> <body> <div id="map-wrap" style="height: 500px;"> <!-- 这里以后是地图 --> </div> </body> <script src="/dep/echarts.min.js"></script> <script src="/extension/bmap.js"></script> </html>
三、绘制地图
1.在 js 中,新建 ECharts 示例,并为其设置配置项 option:
var bmapChart = echarts.init(document.getElementById(‘map-wrap‘)); var option = { // 这里是 ECharts 的配置项,接下来会说明 } bmapChart.setOption(option);
2.添加百度地图:
在 option 中添加 bmap 相关设置:
var option = { bmap: { center: [116.307698, 40.056975], // 中心位置坐标 zoom: 5, // 地图缩放比例 roam: true // 开启用户缩放 } }
ECharts 将百度地图部分配置集成在了 bmap 中,包括:
参数 | 说明 | 格式 |
---|---|---|
center | 中心点的百度坐标 | 坐标数组, 如:[116.307698, 40.056975] |
zoom | 初始缩放比 | number |
roam | 是否允许用户缩放操作 | boolean |
mapStyle | 地图自定义样式 | object, 如:{ styleJson: […] } |
这样百度地图就加载到页面中了,这里显示百度地图的默认样式,稍后第四部分将为百度地图添加自定义样式的配置:
四、绘制散点图
绘制散点图的方法与上篇中绘制散点图方法相同,需要修改的部分是,将散点图的坐标系 coordinateSystem
改成使用 bmap
var myData = [ {name: ‘海门‘, value: [121.15, 31.89, 90]}, {name: ‘鄂尔多斯‘, value: [109.781327, 39.608266, 120]}, {name: ‘招远‘, value: [120.38, 37.35, 142]}, {name: ‘舟山‘, value: [122.207216, 29.985295, 123]}, ... ] var option = { bmap: { ... }, visualMap: { // 视觉映射组件 type: ‘continuous‘, min: 0, max: 200, calculable: true, inRange: { color: [‘#50a3ba‘,‘#eac736‘,‘#d94e5d‘] }, textStyle: { color: ‘#fff‘ } } series: [ { name: ‘销量‘, type: ‘scatter‘, coordinateSystem: ‘bmap‘, // 坐标系使用bmap data: myData } ] }
绘制散点后的百度地图:
四、 自定义百度地图样式
地图的样式配置 bmap.mapStyle
中 styleJson
与百度地图内置的样式配置一致,具体参考百度地图API开发指南中 定制个性地图 章节的介绍。
这里我们设置一个较暗色调的地图,如下:
var option = { bmap: { center: [116.307698, 40.056975], zoom: 5, roam: true, // 允许缩放 mapStyle: { // 百度地图自定义样式 styleJson: [ // 陆地 { "featureType": "land", "elementType": "all", "stylers": { "color": "#073763" } }, // 水系 { "featureType": "water", "elementType": "all", "stylers": { "color": "#073763", "lightness": -54 } }, // 国道与高速 { "featureType": "highway", "elementType": "all", "stylers": { "color": "#45818e" } }, // 边界线 { "featureType": "boundary", "elementType": "all", "stylers": { "color": "#ffffff", "lightness": -62, "visibility": "on" } }, // 行政标注 { "featureType": "label", "elementType": "labels.text.fill", "stylers": { "color": "#ffffff", "visibility": "on" } }, { "featureType": "label", "elementType": "labels.text.stroke", "stylers": { "color": "#444444", "visibility": "on" } } ] } }, ... }
实现效果如下图:
除了上述四个配置,其他地图设置都可以通过 百度地图提供的API 实现
获取百度地图实例的方法如下:
var bmap = bmapCharts.getModel().getComponent(‘bmap‘).getBMap(); // 百度地图实例
例如,我们可以为地图添加一个缩放控件和一个比例尺:
bmap.addControl(new BMap.NavigationControl()); // 缩放控件 bmap.addControl(new BMap.ScaleControl()); // 比例尺
http://echarts.baidu.com/blog/2016/06/13/echarts-map-tutorial.html
一个地图的数据示例:
option = { title : { text: ‘iphone销量‘, subtext: ‘纯属虚构‘, x:‘center‘ }, tooltip : { trigger: ‘item‘ }, legend: { orient: ‘vertical‘, x:‘left‘, data:[‘iphone3‘,‘iphone4‘,‘iphone5‘] }, dataRange: { min: 0, max: 2500, x: ‘left‘, y: ‘bottom‘, text:[‘高‘,‘低‘], // 文本,默认为数值文本 calculable : true }, toolbox: { show: true, orient : ‘vertical‘, x: ‘right‘, y: ‘center‘, feature : { mark : {show: true}, dataView : {show: true, readOnly: false}, restore : {show: true}, saveAsImage : {show: true} } }, roamController: { show: true, x: ‘right‘, mapTypeControl: { ‘china‘: true } }, series : [ { name: ‘iphone3‘, 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)} ] }, { name: ‘iphone4‘, type: ‘map‘, mapType: ‘china‘, 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: ‘iphone5‘, type: ‘map‘, mapType: ‘china‘, 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)} ] } ] };
效果图:
http://echarts.baidu.com/echarts2/doc/example/map1.html
数据2:
function randomData() { return Math.round(Math.random()*1000); } option = { title: { text: ‘iphone销量‘, subtext: ‘纯属虚构‘, left: ‘center‘ }, tooltip: { trigger: ‘item‘ }, legend: { orient: ‘vertical‘, left: ‘left‘, data:[‘iphone3‘,‘iphone4‘,‘iphone5‘] }, visualMap: { min: 0, max: 2500, left: ‘left‘, top: ‘bottom‘, text: [‘高‘,‘低‘], // 文本,默认为数值文本 calculable: true }, toolbox: { show: true, orient: ‘vertical‘, left: ‘right‘, top: ‘center‘, feature: { dataView: {readOnly: false}, restore: {}, saveAsImage: {} } }, series: [ { name: ‘iphone3‘, type: ‘map‘, mapType: ‘china‘, roam: false, label: { normal: { show: true }, emphasis: { show: true } }, data:[ {name: ‘北京‘,value: randomData() }, {name: ‘天津‘,value: randomData() }, {name: ‘上海‘,value: randomData() }, {name: ‘重庆‘,value: randomData() }, {name: ‘河北‘,value: randomData() }, {name: ‘河南‘,value: randomData() }, {name: ‘云南‘,value: randomData() }, {name: ‘辽宁‘,value: randomData() }, {name: ‘黑龙江‘,value: randomData() }, {name: ‘湖南‘,value: randomData() }, {name: ‘安徽‘,value: randomData() }, {name: ‘山东‘,value: randomData() }, {name: ‘新疆‘,value: randomData() }, {name: ‘江苏‘,value: randomData() }, {name: ‘浙江‘,value: randomData() }, {name: ‘江西‘,value: randomData() }, {name: ‘湖北‘,value: randomData() }, {name: ‘广西‘,value: randomData() }, {name: ‘甘肃‘,value: randomData() }, {name: ‘山西‘,value: randomData() }, {name: ‘内蒙古‘,value: randomData() }, {name: ‘陕西‘,value: randomData() }, {name: ‘吉林‘,value: randomData() }, {name: ‘福建‘,value: randomData() }, {name: ‘贵州‘,value: randomData() }, {name: ‘广东‘,value: randomData() }, {name: ‘青海‘,value: randomData() }, {name: ‘西藏‘,value: randomData() }, {name: ‘四川‘,value: randomData() }, {name: ‘宁夏‘,value: randomData() }, {name: ‘海南‘,value: randomData() }, {name: ‘台湾‘,value: randomData() }, {name: ‘香港‘,value: randomData() }, {name: ‘澳门‘,value: randomData() } ] }, { name: ‘iphone4‘, type: ‘map‘, mapType: ‘china‘, label: { normal: { show: true }, emphasis: { show: true } }, data:[ {name: ‘北京‘,value: randomData() }, {name: ‘天津‘,value: randomData() }, {name: ‘上海‘,value: randomData() }, {name: ‘重庆‘,value: randomData() }, {name: ‘河北‘,value: randomData() }, {name: ‘安徽‘,value: randomData() }, {name: ‘新疆‘,value: randomData() }, {name: ‘浙江‘,value: randomData() }, {name: ‘江西‘,value: randomData() }, {name: ‘山西‘,value: randomData() }, {name: ‘内蒙古‘,value: randomData() }, {name: ‘吉林‘,value: randomData() }, {name: ‘福建‘,value: randomData() }, {name: ‘广东‘,value: randomData() }, {name: ‘西藏‘,value: randomData() }, {name: ‘四川‘,value: randomData() }, {name: ‘宁夏‘,value: randomData() }, {name: ‘香港‘,value: randomData() }, {name: ‘澳门‘,value: randomData() } ] }, { name: ‘iphone5‘, type: ‘map‘, mapType: ‘china‘, label: { normal: { show: true }, emphasis: { show: true } }, data:[ {name: ‘北京‘,value: randomData() }, {name: ‘天津‘,value: randomData() }, {name: ‘上海‘,value: randomData() }, {name: ‘广东‘,value: randomData() }, {name: ‘台湾‘,value: randomData() }, {name: ‘香港‘,value: randomData() }, {name: ‘澳门‘,value: randomData() } ] } ] };
http://echarts.baidu.com/demo.html#map-china-dataRange
在开发站点流量统计平台的过程中,需要将网站访客IP地理位置数据进行可视化,而可视化的工具则包括D3.js、HighMap.js以及Echart.js等等等等,综合来看,Echart使用更为简单,更容易上手,其效果大致如下:
1 、Echart简介
ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的 Canvas 类库 ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表。ECharts 提供了常规的折线图,柱状图,散点图,饼图,K线图,用于统计的盒形图,用于地理数据可视化的地图,热力图,线图,用于关系数据可视化的关系图,treemap,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。
项目主页: http://echarts.baidu.com/
GitHub: https://github.com/ecomfe/echarts
2、数据示例
现有访问地理分布的数据如下所示,你可以在服务器端使用一定的方法进行构造:
{ "series": [ { "name": "北京城市记忆主站点", "type": "map", "mapType": "china", "data": [{"name":"","value":6},{"name":"Amazonas","value":1},{"name":"Antioquia","value":1},{"name":"Canarias","value":1},{"name":"Ceara","value":1},{"name":"Leiria","value":1},{"name":"Lombardia","value":1},{"name":"Marrakech-Tensift-Al Haouz","value":1},{"name":"Mato Grosso do Sul","value":1},{"name":"Minas Gerais","value":1},{"name":"Noord-Holland","value":19},{"name":"Pays de la Loire","value":1},{"name":"Rajasthan","value":1},{"name":"Region Metropolitana","value":1},{"name":"Rio Grande do Sul","value":1},{"name":"Seoul-t‘ukpyolsi","value":4},{"name":"Tanger-Tetouan","value":1},{"name":"Toscana","value":1},{"name":"上海","value":18},{"name":"伊利诺伊","value":1},{"name":"佛罗里达","value":1},{"name":"俄亥俄州","value":1},{"name":"内蒙古","value":2},{"name":"加利福尼亚","value":13},{"name":"北京","value":1614},{"name":"华盛顿州","value":5},{"name":"圣保罗","value":6},{"name":"墨西哥城","value":1},{"name":"天津","value":6},{"name":"奇瓦瓦","value":1},{"name":"山东","value":767},{"name":"山西","value":2},{"name":"布宜诺斯艾利斯","value":1},{"name":"广东","value":6},{"name":"广西","value":4},{"name":"得克萨斯州","value":2},{"name":"新疆","value":36},{"name":"江苏","value":3},{"name":"河内","value":1},{"name":"河北","value":3},{"name":"河南","value":1},{"name":"浙江","value":11},{"name":"湖北","value":5},{"name":"湖南","value":2},{"name":"贝尔法斯特","value":1},{"name":"辽宁","value":1},{"name":"里约热内卢","value":1},{"name":"重庆","value":7},{"name":"陕西","value":3},{"name":"香港","value":3}] }, { "name": "北京说唱艺术", "type": "map", "mapType": "china", "data": [{"name":"Seoul-t‘ukpyolsi","value":3},{"name":"上海","value":9},{"name":"伦敦","value":6},{"name":"加利福尼亚","value":17},{"name":"北京","value":3192},{"name":"华盛顿州","value":1},{"name":"天津","value":7},{"name":"河北","value":37},{"name":"浙江","value":1},{"name":"重庆","value":6}] }, { "name": "北京饮食文化", "type": "map", "mapType": "china", "data": [{"name":"上海","value":2},{"name":"加利福尼亚","value":4},{"name":"北京","value":898},{"name":"华盛顿州","value":4},{"name":"天津","value":15},{"name":"山西","value":1},{"name":"广东","value":1},{"name":"河南","value":42},{"name":"浙江","value":1},{"name":"重庆","value":1}] }, { "name": "瑞蚨祥", "type": "map", "mapType": "china", "data": [{"name":"北京","value":95},{"name":"浙江","value":1}] }, { "name": "内联升", "type": "map", "mapType": "china", "data": [{"name":"北京","value":209},{"name":"山西","value":1},{"name":"重庆","value":2}] }, { "name": "八大水院", "type": "map", "mapType": "china", "data": [{"name":"上海","value":8},{"name":"内蒙古","value":3},{"name":"加利福尼亚","value":13},{"name":"北京","value":1491},{"name":"广西","value":6},{"name":"浙江","value":4}] }, { "name": "国学孔庙", "type": "map", "mapType": "china", "data": [{"name":"上海","value":3},{"name":"加利福尼亚","value":2},{"name":"北京","value":185}] } ], "max": 9168, "legend": [ "北京城市记忆主站点", "北京说唱艺术", "北京饮食文化", "瑞蚨祥", "内联升", "八大水院", "国学孔庙" ] }
如上所示,在data中,其内部每一个jsonObject都包含一个name与value,其中的name则是后台在统计时直接通过ip地址查询的接口获得的省份,Echart会自动对应这些name到地图上相应的省份,同时剔除掉数据中在地图GeoJSON中所不包含的省份。
3、引入Echart与中国GeoJSON
GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法的地理空间信息数据交换格式。GeoJSON对象可以表示几何、特征或者特征集合。简单来说就是有了这个数据Echart就能在H5的canvas中绘制出中国地图了。
Echart的官网上提供世界地图、中国地图以及中国各省份地图的JSON格式与JS格式的GeoJSON数据下载:http://echarts.baidu.com/download-map.html
页面中引入Echart:
<script src="js/echarts.min.js"></script>
引入地图GeoJSON数据有两种途径,一种是引入相应的JS,另外一种则是通过ajax get加载相应的JSON文件,这里使用第二种方法:
$.get(‘js/map/china.json‘).done(function(mapData){ echarts.registerMap(‘china‘, mapData); });
如上所示,我们在get到china.json数据后,注册了一个名为’china’的map对象,这在之后生成地图的时候会用到。
4、加载数据
我们通过jquery Ajax Get请求后台的数据接口,返回如示例中的数据格式,然后将数据加载到echart对象中:
<div id="visit-map" class="visit-map" style="height: 600px;width: 100%;"></div> <script src="js/jquery-1.12.2.min.js" type="text/javascript"></script> <script src="js/echarts.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function(){ //初始化一个Echart对象 var visitMap = echarts.init(document.getElementById(‘visit-map‘)); //定义你的后台数据接口 var url = ‘your backend data api 你的后台数据接口‘; //显示chart加载动画 visitMap.showLoading(); //get GeoJSON数据 $.get(‘js/map/china.json‘).done(function(mapData){ //注册China地图对象 echarts.registerMap(‘china‘, mapData); //请求后端数据 $.get(url).done(function(data){ var mapOption = { title: { text: ‘访问地理分布‘, subtext: ‘北京城市记忆站点访问地理分布‘, left: ‘center‘ }, //设置提示工具样式,formatter中构造提示的数据类型以及样式 tooltip: { trigger: ‘item‘, formatter: function(mapData){ var city = mapData.data.name; var totleNum = 0; var res = ""; $.each(data.series,function(key,value){ $.each(value.data,function(key,cityValue){ if(cityValue.name == mapData.data.name){ res+=value.name+" : "+cityValue.value+"<br/>"; totleNum+=cityValue.value; } }); }); res = ‘<div style="border-bottom: 1px solid rgba(255,255,255,.3); font-size: 18px;padding-bottom: 7px;margin-bottom: 7px">‘ +mapData.data.name+":"+totleNum+"</div>" +res; return res; } }, legend: { orient: ‘vertical‘, left: ‘left‘, data:data.legend }, visualMap: { max:data.max, min: 0, left: ‘left‘, top: ‘bottom‘, text: [‘高‘,‘低‘], // 文本,默认为数值文本 calculable: true, color: [‘orangered‘,‘yellow‘,‘lightskyblue‘] }, toolbox: { show: true, orient: ‘vertical‘, left: ‘right‘, top: ‘center‘, feature: { dataView: {readOnly: false}, restore: {}, saveAsImage: {} } }, series: data.series }; //隐藏加载动画 visitMap.hideLoading(); //设置echart对象的属性,setOption()是一个万用的方法 visitMap.setOption(mapOption,true); }); }); }); </script>
需要注意的是,这里为了方便很多定义项都在后端设置了,比如后端数据series中的mapType后台已经写为我们注册过的地图类型’china’了,因此在构造数据的时候需要留意。
5、完成