echarts 专题

todo:
缩放


5 分钟上手 ECharts

获取 ECharts

你可以通过以下几种方式获取 ECharts。

  1. 官网下载界面选择你需要的版本下载,根据开发者功能和体积上的需求,我们提供了不同打包的下载,如果你在体积上没有要求,可以直接下载完整版本。开发环境建议下载源代码版本,包含了常见的错误提示和警告。

  2. 在 ECharts 的 GitHub 上下载最新的 release 版本,解压出来的文件夹里的 dist 目录里可以找到最新版本的 echarts 库。

  3. 通过 npm 获取 echarts,npm install echarts --save,详见“在 webpack 中使用 echarts

  4. cdn 引入,你可以在 cdnjsnpmcdn 或者国内的 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数据内容
        }
    ]
}

数据添加完成,就可以在图表中看到渲染出的散点了:

散点图1

3.添加视觉映射组件

视觉映射组件是标识某一数据范围内数据及颜色对应关系的控件,视觉映射组件分为连续型和分段型,这里我们选用连续型 type:continuous 。同时,通过视觉映射组件可以实现 ECharts 值域漫游功能,即通过拖拽控件手柄选择不同数值范围,达到对图表数据的筛选显示。 在 visualMap属性中设置值域控件的相关配置:

var option = {
    ...

    visualMap: {
        type: 'continuous', // 连续型
        min: 0,               // 值域最小值,必须参数
        max: 200,            // 值域最大值,必须参数
        calculable: true,    // 是否启用值域漫游
        inRange: {
                 color: ['#50a3ba','#eac736','#d94e5d']
                             // 指定数值从低到高时的颜色变化
          },
        textStyle: {
            color: '#fff'    // 值域控件的文本颜色
        }
         }
}

添加了值域控件的图表效果:

散点图2

这样一个基于中国地图的散点图就基本实现了,如果想要继续完善图表,可以为它添加标题,图例,高亮提示等控件,配置方式在这里查看(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: […] }

这样百度地图就加载到页面中了,这里显示百度地图的默认样式,稍后第四部分将为百度地图添加自定义样式的配置:

百度地图1

四、绘制散点图

绘制散点图的方法与上篇中绘制散点图方法相同,需要修改的部分是,将散点图的坐标系 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
        }
    ]
}

绘制散点后的百度地图:

百度地图2

四、 自定义百度地图样式

地图的样式配置 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"
                          }
                      }
                     ]
                 }
          },
          ...
    }

实现效果如下图:

百度地图3

除了上述四个配置,其他地图设置都可以通过 百度地图提供的API 实现

获取百度地图实例的方法如下:

var bmap = bmapCharts.getModel().getComponent('bmap').getBMap(); // 百度地图实例

例如,我们可以为地图添加一个缩放控件和一个比例尺:

 
bmap.addControl(new BMap.NavigationControl()); // 缩放控件
bmap.addControl(new BMap.ScaleControl()); // 比例尺


百度地图4

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.jsHighMap.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、完成

 

posted @ 2017-06-26 19:37  沧海一滴  阅读(4956)  评论(3编辑  收藏  举报