1 ECharts简介
ECharts缩写来自Enterprise Charts,商业级数据图表,是百度的一个开源的使用 JavaScript实现的数据可视化工具,可以流畅的运行在 PC 和移动设备上,兼容当前绝大 部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的矢量图 形库 ZRender,提供直观、交互丰富、可高度个性化定制的数据可视化图表。
官网:https://echarts.baidu.com/
下载地址:https://echarts.baidu.com/download.html
下载完成可以得到如下文件:
解压上面的zip文件:
我们只需要将dist目录下的echarts.js文件引入到页面上就可以使用了
5分钟上手ECharts
我们可以参考官方提供的5分钟上手ECharts文档感受一下ECharts的使用方式,地址如 下:
第一步:
创建html页面并引入echarts.js文件
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <!-- 引入 ECharts 文件 -->
- <script src="echarts.js"></script>
- </head>
- </html>
-
第二步:
在页面中准备一个具备宽高的DOM容器。
- <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
- <div id="main" style="width: 600px;height:400px;"></div>
-
第三步:
通过echarts.init方法初始化一个 echarts 实例并通过setOption方法生成一个简 单的柱状图
- <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>
-
整个页面代码:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <!-- 引入 ECharts 文件 -->
- <script src="echarts.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>
-
效果如下:
3 查看ECharts官方实例
ECharts提供了很多官方实例,我们可以通过这些官方实例来查看展示效果和使用方法。
官方实例地址:https://www.echartsjs.com/examples/
可以点击具体的一个图形会跳转到编辑页面,编辑页面左侧展示重点部分的源码(js部分源码),右 侧展示图表效果,如下:
要查看完整代码可以点击右下角的Download按钮将完整页面下载到本地。 通过官方案例我们可以发现,使用ECharts展示图表效果,关键点在于确定此图表所需的 数据格式,然后按照此数据格式提供数据就可以了,我们无须关注效果是如何渲染出来 的。
在实际应用中,我们要展示的数据往往存储在数据库中,所以我们可以发送ajax请求获取 数据库中的数据并转为图表所需的数据即可。
以下就是一个折线图案例
会员数量折线图
会员数量折线图对应的页面为report_member.html。
- <body class="hold-transition">
- <div id="app">
- <div class="content-header">
- <h1>统计分析<small>会员数量</small></h1>
- <el-breadcrumb separator-class="el-icon-arrow-right" class="breadcrumb">
- <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
- <el-breadcrumb-item>统计分析</el-breadcrumb-item>
- <el-breadcrumb-item>会员数量</el-breadcrumb-item>
- </el-breadcrumb>
- </div>
- <div class="app-container">
- <div class="box">
- <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
- <div id="chart1" style="height:600px;"></div>
- </div>
- </div>
- </div>
- </body>
- <!-- 引入组件库 -->
- <script src="../js/vue.js"></script>
- <script src="../js/axios-0.18.0.js"></script>
- <script type="text/javascript">
- // 基于准备好的dom,初始化echarts实例
- var myChart1 = echarts.init(document.getElementById('chart1'));
-
- // 使用刚指定的配置项和数据显示图表。
- //myChart.setOption(option);
-
- axios.get("/report/getMemberReport.do").then((res)=>{
- myChart1.setOption(
- {
- title: {
- text: '会员数量'
- },
- tooltip: {},
- legend: {
- data:['会员数量']
- },
- xAxis: {
- data: res.data.data.months
- },
- yAxis: {
- type:'value'
- },
- series: [{
- name: '会员数量',
- type: 'line',
- data: res.data.data.memberCount
- }]
- });
- });
- </script>
-
根据折线图对数据格式的要求,我们发送ajax请求,页面要求服务端需要返回如下格式的数据:
- {
- "data":{
- "months":["2019.01","2019.02","2019.03","2019.04"],
- "memberCount":[3,4,8,10]
- },
- "flag":true,
- "message":"获取会员统计数据成功"
- }
-
res.data.data.memberCount:
res.data:回调函数
res.data.data:拿到回台返回的封装类Result中的data(data属性的类型为Map类型,为了我们可以在返回的数据当中添加给的的类型)
res.data.data.memberCount:map集合中的memberCount数据
我们现在后台controller处模拟返回的数据格式
- @RequestMapping("/getMemberReport")
- public Result getMemberReport() {
- //模拟数据使用map封装数据 String保存属性名,Object保存属性值
- Map<String, Object> map = new HashMap<>(); //map保存 "months":["2019.01","2019.02","2019.03","2019.04"]
- List<String> months = new ArrayList<>(); //months保存 ["2019.01","2019.02","2019.03","2019.04"]
- List<Integer> memberCount = new ArrayList<>(); // memberCount保存 [3,4,8,10]
-
- //将年份存储到List集合当中,再将List集合对象存储在map当中
- months.add("2019.01");
- months.add("2019.02");
- months.add("2019.03");
- months.add("2019.04");
- map.put("months", months);
-
- //将数量存储到List集合当中,再将List集合对象存储在map当中
- memberCount.add(100);
- memberCount.add(400);
- memberCount.add(300);
- memberCount.add(400);
- map.put("memberCount", memberCount);
-
- return new Result(true, MessageConstant.GET_MEMBER_NUMBER_REPORT_SUCCESS, map);
- }
-
- /**
- * 封装返回结果
- */
- public class Result implements Serializable{
- private boolean flag;//执行结果,true为执行成功 false为执行失败
- private String message;//返回结果信息,主要用于页面提示信息
- private Object data;//返回数据
- public Result(boolean flag, String message) {
- super();
- this.flag = flag;
- this.message = message;
- }
-
- public Result(boolean flag, String message, Object data) {
- this.flag = flag;
- this.message = message;
- this.data = data;
- }
-
- public boolean isFlag() {
- return flag;
- }
- public void setFlag(boolean flag) {
- this.flag = flag;
- }
- public String getMessage() {
- return message;
- }
- public void setMessage(String message) {
- this.message = message;
- }
-
- public Object getData() {
- return data;
- }
-
- public void setData(Object data) {
- this.data = data;
- }
- }
-
页面效果
我们通过观察数据的响应,查看后台返回的数据是否符合官网要求的数据格式
使用json在线解析工具,就可以更清楚的发现数据正是我们页面要使用的数据格式
后台controller方法
- /***
- * 统计报表
- * */
- @RestController
- @RequestMapping("/report")
- public class ReportController {
-
- @Reference
- private MemberService memberService;
-
- @RequestMapping("/getMemberReport")
- public Result getMemberReport(){
- Map<String,Object> map = new HashMap<>(); //map保存 "months":["2019.01","2019.02","2019.03","2019.04"]
- List<String> months = new ArrayList(); //months保存 ["2019.01","2019.02","2019.03","2019.04"]
-
- Calendar calendar = Calendar.getInstance();//获得日历对象,模拟时间就是当前时间
- //计算过去一年的12个月
- calendar.add(Calendar.MONTH,-12);//获得当前时间往前推12个月的时间
- for(int i=0;i<12;i++){
- calendar.add(Calendar.MONTH,1);//获得当前时间往后推一个月日期
- Date date = calendar.getTime();
- months.add(new SimpleDateFormat("yyyy.MM").format(date));
- }
- map.put("months",months);
-
- List<Integer> memberCount = memberService.findMemberCountByMonths(months);
- map.put("memberCount",memberCount);
- return new Result(true, MessageConstant.GET_MEMBER_NUMBER_REPORT_SUCCESS,map);
- }
-
-
- }
-
service接口
- //根据月份查询会员数量
- public List<Integer> findMemberCountByMonths(List<String> months) {//2018.05
- List<Integer> memberCount = new ArrayList<>();
- for (String month : months) {
- String date = month + ".31";//2018.05.31
- Integer count = memberDao.findMemberCountBeforeDate(date);
- memberCount.add(count);
- }
- return memberCount;
- }
-
dao层
- public Integer findMemberCountBeforeDate(String date);
-
-
xml:
- <!--根据日期统计会员数,统计指定日期之前的会员数-->
- <select id="findMemberCountBeforeDate" parameterType="string" resultType="int">
- select count(id) from t_member where regTime <= #{value}
- </select>
-