一、简介
EChart是百度开发的js图表软件,用它我们可以很方便地以图形化的方式对数据进行分析统计。该种方式js在页面动态拼接json数据,再进行渲染。这种方法的优点是,灵活,可以随时进行修改。缺点是js代码多,难以维护。此时我们可以Java EChart插件,在后端构造好option数据,最后在页面直接使用构造好的option数据,渲染效果。下载地址为: http://git.oschina.net/free/ECharts
EChart提供链式的调用方法,使用也比较方便。它依赖Google的gson包,gson下载地址为: https://github.com/google/gson 。gson与EChart加入项目依赖。
maven依赖如下:

<dependency>
  <groupId>com.github.abel533</groupId>
  <artifactId>ECharts</artifactId>
  <version>2.2.7</version>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.5</version>
</dependency>

二、示例
1、柱状图

 1     /**
 2      * 柱状图
 4      * @param isHorizontal
 5      *            是否水平放置
 6      */
 7     public void testBar(boolean isHorizontal) {
 8         String[] citis = { "广州", "深圳", "珠海", "汕头", "韶关", "佛山" };
 9         int[] datas = { 6030, 7800, 5200, 3444, 2666, 5708 };
10         String[] colors = { "rgb(2,111,230)", "rgb(186,73,46)", "rgb(78,154,97)", "rgb(2,111,230)", "rgb(186,73,46)", "rgb(78,154,97)" };
11         String title = "地市数据";
13         GsonOption option = new GsonOption();
15         option.title(title); // 标题
16         // 工具栏
17         option.toolbox().show(true).feature(Tool.mark, // 辅助线
18                 Tool.dataView, // 数据视图
19                 new MagicType(Magic.line, Magic.bar),// 线图、柱状图切换
20                 Tool.restore,// 还原
21                 Tool.saveAsImage);// 保存为图片
23         option.tooltip().show(true).formatter("{a} <br/>{b} : {c}");//显示工具提示,设置提示格式
25         option.legend(title);// 图例
27         Bar bar = new Bar(title);// 图类别(柱状图)
28         CategoryAxis category = new CategoryAxis();// 轴分类
29         category.data(citis);// 轴数据类别
30         // 循环数据
31         for (int i = 0; i < citis.length; i++) {
32             int data = datas[i];
33             String color = colors[i];
34             // 类目对应的柱状图
35             Map<String, Object> map = new HashMap<String, Object>(2);
36             map.put("value", data);
37             map.put("itemStyle", new ItemStyle().normal(new Normal().color(color)));
38             bar.data(map);
39         }
41         if (isHorizontal) {// 横轴为类别、纵轴为值
42             option.xAxis(category);// x轴
43             option.yAxis(new ValueAxis());// y轴
44         } else {// 横轴为值、纵轴为类别
45             option.xAxis(new ValueAxis());// x轴
46             option.yAxis(category);// y轴
47         }
49         option.series(bar); 

   生成的json数据如下:

2 "title": { 3 "text": "地市数据" 4 }, 5 "toolbox": { 6 "feature": { 7 "mark": { 8 "show": true, 9 "title": { 10 "mark": "辅助线开关", 11 "markClear": "清空辅助线", 12 "markUndo": "删除辅助线" 13 }, 14 "lineStyle": { 15 "color": "#1e90ff", 16 "type": "dashed", 17 "width": 2 18 } 19 }, 20 "dataView": { 21 "show": true, 22 "title": "数据视图", 23 "readOnly": false, 24 "lang": ["数据视图", "关闭", "刷新"] 25 }, 26 "magicType": { 27 "show": true, 28 "title": { 29 "line": "折线图切换", 30 "stack": "堆积", 31 "bar": "柱形图切换", 32 "tiled": "平铺" 33 }, 34 "type": ["line", "bar"] 35 }, 36 "restore": { 37 "show": true, 38 "title": "还原" 39 }, 40 "saveAsImage": { 41 "show": true, 42 "title": "保存为图片", 43 "type": "png", 44 "lang": ["点击保存"] 45 } 46 }, 47 "show": true 48 }, 49 "tooltip": { 50 "formatter": "{a} <br/>{b} : {c}", 51 "show": true 52 }, 53 "legend": { 54 "data": ["地市数据"] 55 }, 56 "xAxis": [{ 57 "type": "category", 58 "data": ["广州", "深圳", "珠海", "汕头", "韶关", "佛山"] 59 }], 60 "yAxis": [{ 61 "type": "value" 62 }], 63 "series": [{ 64 "name": "地市数据", 65 "type": "bar", 66 "data": [{ 67 "value": 6030, 68 "itemStyle": { 69 "normal": { 70 "color": "rgb(2,111,230)" 71 } 72 } 73 }, { 74 "value": 7800, 75 "itemStyle": { 76 "normal": { 77 "color": "rgb(186,73,46)" 78 } 79 } 80 }, { 81 "value": 5200, 82 "itemStyle": { 83 "normal": { 84 "color": "rgb(78,154,97)" 85 } 86 } 87 }, { 88 "value": 3444, 89 "itemStyle": { 90 "normal": { 91 "color": "rgb(2,111,230)" 92 } 93 } 94 }, { 95 "value": 2666, 96 "itemStyle": { 97 "normal": { 98 "color": "rgb(186,73,46)" 99 } 100 } 101 }, { 102 "value": 5708, 103 "itemStyle": { 104 "normal": { 105 "color": "rgb(78,154,97)" 106 } 107 } 108 }] 109 }] 110 }
View Code

生成的图如下:

2、折线图

 1 /**
 2      * 折线图
 4      * @param isHorizontal
 5      *            是否水平放置
 6      */
 7     public void testLine(boolean isHorizontal) {
 8         String[] types = { "邮件营销", "联盟广告", "视频广告" };
 9         int[][] datas = { { 120, 132, 101, 134, 90, 230, 210 }, { 220, 182, 191, 234, 290, 330, 310 }, { 150, 232, 201, 154, 190, 330, 410 } };
10         String title = "广告数据";
12         GsonOption option = new GsonOption();
14         option.title().text(title).subtext("虚构").x("left");// 大标题、小标题、位置
16         // 提示工具
17         option.tooltip().trigger(Trigger.axis);// 在轴上触发提示数据
18         // 工具栏
19         option.toolbox().show(true).feature(Tool.saveAsImage);// 显示保存为图片
21         option.legend(types);// 图例
23         CategoryAxis category = new CategoryAxis();// 轴分类
24         category.data("周一", "周二", "周三", "周四", "周五", "周六", "周日");
25         category.boundaryGap(false);// 起始和结束两端空白策略
27         // 循环数据
28         for (int i = 0; i < types.length; i++) {
29             Line line = new Line();// 三条线,三个对象
30             String type = types[i];
31             line.name(type).stack("总量");
32             for (int j = 0; j < datas[i].length; j++)
33                 line.data(datas[i][j]);
34             option.series(line);
35         }
37         if (isHorizontal) {// 横轴为类别、纵轴为值
38             option.xAxis(category);// x轴
39             option.yAxis(new ValueAxis());// y轴
40         } else {// 横轴为值、纵轴为类别
41             option.xAxis(new ValueAxis());// x轴
42             option.yAxis(category);// y轴
43         }

  生成的json数据如下:

2 "title": { 3 "text": "广告数据", 4 "subtext": "虚构", 5 "x": "left" 6 }, 7 "toolbox": { 8 "feature": { 9 "saveAsImage": { 10 "show": true, 11 "title": "保存为图片", 12 "type": "png", 13 "lang": ["点击保存"] 14 } 15 }, 16 "show": true 17 }, 18 "tooltip": { 19 "trigger": "axis" 20 }, 21 "legend": { 22 "data": ["邮件营销", "联盟广告", "视频广告"] 23 }, 24 "xAxis": [{ 25 "boundaryGap": false, 26 "type": "category", 27 "data": ["周一", "周二", "周三", "周四", "周五", "周六", "周日"] 28 }], 29 "yAxis": [{ 30 "type": "value" 31 }], 32 "series": [{ 33 "name": "邮件营销", 34 "type": "line", 35 "stack": "总量", 36 "data": [120, 132, 101, 134, 90, 230, 210] 37 }, { 38 "name": "联盟广告", 39 "type": "line", 40 "stack": "总量", 41 "data": [220, 182, 191, 234, 290, 330, 310] 42 }, { 43 "name": "视频广告", 44 "type": "line", 45 "stack": "总量", 46 "data": [150, 232, 201, 154, 190, 330, 410] 47 }] View Code

  生成的图如下:

 1 /**
 2      *  饼图
 3      */
 4     public void testPie() {
 5         String[] types = { "邮件营销", "联盟广告", "视频广告" };
 6         int[] datas = { 120, 132, 101 };
 7         String title = "广告数据";
 8         GsonOption option = new GsonOption();
10         option.title().text(title).subtext("虚构").x("center");// 大标题、小标题、标题位置
12         // 提示工具 鼠标在每一个数据项上,触发显示提示数据
13         option.tooltip().trigger(Trigger.item).formatter("{a} <br/>{b} : {c} ({d}%)");
15         // 工具栏
16         option.toolbox().show(true).feature(new Mark().show(true),// 辅助线
17                 new DataView().show(true).readOnly(false),// 数据视图
18                 new MagicType().show(true).type(new Magic[] { Magic.pie, Magic.funnel }), //饼图、漏斗图切换
19                 new Option().series(new Funnel().x("25%").width("50%").funnelAlign(X.left).max(1548)),// 漏斗图设置
20                 Tool.restore,// 还原
21                 Tool.saveAsImage);// 保存为图片
23         option.legend().orient(Orient.horizontal).x("left").data(types);// 图例及位置
25         option.calculable(true);// 拖动进行计算
27         Pie pie = new Pie();
29         // 标题、半径、位置
30         pie.name(title).radius("55%").center("50%", "60%");
32         // 循环数据
33         for (int i = 0; i < types.length; i++) {
34             Map<String, Object> map = new HashMap<String, Object>(2);
35             map.put("value", datas[i]);
36             map.put("name", types[i]);
37             pie.data(map);
38         }
40         option.series(pie); 

  生成的json数据如下:

2 "calculable": true, 3 "title": { 4 "text": "广告数据", 5 "subtext": "虚构", 6 "x": "center" 7 }, 8 "toolbox": { 9 "feature": { 10 "mark": { 11 "show": true, 12 "title": { 13 "mark": "辅助线开关", 14 "markClear": "清空辅助线", 15 "markUndo": "删除辅助线" 16 }, 17 "lineStyle": { 18 "color": "#1e90ff", 19 "type": "dashed", 20 "width": 2 21 } 22 }, 23 "dataView": { 24 "show": true, 25 "title": "数据视图", 26 "readOnly": false, 27 "lang": ["数据视图", "关闭", "刷新"] 28 }, 29 "magicType": { 30 "show": true, 31 "title": { 32 "line": "折线图切换", 33 "stack": "堆积", 34 "bar": "柱形图切换", 35 "tiled": "平铺" 36 }, 37 "type": ["pie", "funnel"] 38 }, 39 "restore": { 40 "show": true, 41 "title": "还原" 42 }, 43 "saveAsImage": { 44 "show": true, 45 "title": "保存为图片", 46 "type": "png", 47 "lang": ["点击保存"] 48 } 49 }, 50 "show": true 51 }, 52 "tooltip": { 53 "trigger": "item", 54 "formatter": "{a} <br/>{b} : {c} ({d}%)" 55 }, 56 "legend": { 57 "orient": "horizontal", 58 "data": ["邮件营销", "联盟广告", "视频广告"], 59 "x": "left" 60 }, 61 "series": [{ 62 "center": ["50%", "60%"], 63 "radius": "55%", 64 "name": "广告数据", 65 "type": "pie", 66 "data": [{ 67 "value": 120, 68 "name": "邮件营销" 69 }, { 70 "value": 132, 71 "name": "联盟广告" 72 }, { 73 "value": 101, 74 "name": "视频广告" 75 }] 76 }] View Code

  生成的图如下: