封装Echarts

  项目中需要对数据进行图形展示,例如展示柱状图、饼状图等。这类的前端展示脚本很多,常见的是HighCharts和Echarts。HighCharts是基于svg技术的,而echarts基于canvas,两者技术基础完全不一样,各有特点。而后者是可以在浏览器实现3D图形的。在各种图形展示上基本是差不多,都能满足项目需要。但是HighCharts是收费的,而Echarts是开源免费的,如果用于实际的项目还是使用Echarts。
  使用这类前端脚本,每种图形都需要写很多重复的脚本,复用性低,其实可以将相同的代码进行封装,方便重复使用。之前使用HighCharts时,封装了一个,使用C#和数据库,只需要在数据库中配置Sql语句即可,不需要修改大量的代码。但是使用不方便,需要配置多个表。

  效果展示如下:

封装Echarts_第1张图片
  本文中只封装了前端,调用只需要传入标题、数据等参数即可。主要代码如下:

  1 var MyECharts = {
  2     //格式化数据
  3     ChartDataFormate: {
  4         FormateNOGroupData: function (data) {
  5             var categories = [];
  6             var datas = [];
  7             for (var i = 0; i < data.length; i++) {
  8                 categories.push(data[i].name || '');
  9                 temp_series = { value: data[i].value || 0, name: data[i].name };
 10                 datas.push(temp_series);
 11             }
 12             return { category: categories, data: datas };
 13         },
 14         //处理分组数据,数据格式:group:XXX,name:XXX,value:XXX用于折线图、柱形图(分组,堆积)
 15         //参数:数据、展示类型
 16         FormatGroupData: function (data, type) {
 17             var groups = new Array();
 18             var names = new Array();
 19             var series = new Array();
 20             for (var i = 0; i < data.length; i++) {
 21                 if (!groups.contains(data[i].group)) {
 22                     groups.push(data[i].group);
 23                 }
 24                 if (!names.contains(data[i].name)) {
 25                     names.push(data[i].name);
 26                 }
 27             }
 28             for (var i = 0; i < groups.length; i++) {
 29                 var temp_series = {};
 30                 var temp_data = new Array();
 31                 for (var j = 0; j < data.length; j++) {
 32                     for (var k = 0; k < names.length; k++)
 33                         if (groups[i] == data[j].group && data[j].name == names[k])
 34                             temp_data.push(data[j].value);
 35                     }
 36                     temp_series = { name: groups[i], type: type, data: temp_data };
 37                     series.push(temp_series);
 38                 }
 39                 return { category: names, series: series };
 40             }
 41         },
 42     //生成图形
 43     ChartOptionTemplates: {
 44         //柱状图
 45         Bar: function (title, subtext, data) {
 46             var datas = MyECharts.ChartDataFormate.FormatGroupData(data, 'bar');
 47             var option = {
 48                 title: {
 49                     text: title || '',
 50                     subtext: subtext || '',
 51                     x: 'center'
 52                 },
 53                 tooltip: {
 54                     show: true
 55                 },
 56                 xAxis: [
 57                 {
 58                     type: 'category',
 59                     data: datas.category
 60                 }
 61                 ],
 62                 yAxis: [
 63                 {
 64                     type: 'value'
 65                 }
 66                 ],
 67                 series: datas.series
 68             };
 69             return option;
 70         },
 71         //折线图
 72         Line: function (title, subtext, data) {
 73             var datas = MyECharts.ChartDataFormate.FormatGroupData(data, 'line');
 74             var option = {
 75                 title: {
 76                     text: title || '',
 77                     subtext: subtext || '',
 78                     x: 'center'
 79                 },
 80                 tooltip: {
 81                     show: true
 82                 },
 83                 xAxis: [
 84                 {
 85                     type: 'category',
 86                     data: datas.category
 87                 }
 88                 ],
 89                 yAxis: [
 90                 {
 91                     type: 'value'
 92                 }
 93                 ],
 94                 series: datas.series
 95             };
 96             return option;
 97         },
 98         //饼图
 99         Pie: function (title, subtext, data) {
100             var datas = MyECharts.ChartDataFormate.FormateNOGroupData(data);
101             var option = {
102                 title: {
103                     text: title || '',
104                     subtext: subtext || '',
105                     x: 'center'
106                 },
107                 tooltip: {
108                     show: true,
109                     trigger: 'item',
110                     formatter: "{a} 
{b} : {c} ({d}%)" 111 }, 112 legend: { 113 orient: 'vertical', 114 left: 'left', 115 data: datas.category 116 }, 117 series: [ 118 { 119 name: title, 120 type: 'pie', 121 radius: '55%', 122 center: ['50%', '60%'], 123 data: datas.data, 124 itemStyle: { 125 emphasis: { 126 shadowBlur: 10, 127 shadowOffsetX: 0, 128 shadowColor: 'rgba(0, 0, 0, 0.5)' 129 } 130 } 131 } 132 ] 133 }; 134 return option; 135 }, 136 //散点图 137 Scatter: function (title, subtext, data) { 138 var markLineOpt = { 139 animation: false, 140 label: { 141 normal: { 142 formatter: 'y = 0.5 * x + 3', 143 textStyle: { 144 align: 'right' 145 } 146 } 147 }, 148 lineStyle: { 149 normal: { 150 type: 'solid' 151 } 152 }, 153 tooltip: { 154 formatter: 'y = 0.5 * x + 3' 155 }, 156 data: [[{ 157 coord: [0, 3], 158 symbol: 'none' 159 }, { 160 coord: [20, 13], 161 symbol: 'none' 162 }]] 163 }; 164 165 166 var option = { 167 title: { 168 text: 'Anscombe\'s quartet', 169 x: 'center', 170 y: 0 171 }, 172 grid: [ 173 {x: '7%', y: '7%', width: '38%', height: '38%'}, 174 {x2: '7%', y: '7%', width: '38%', height: '38%'}, 175 {x: '7%', y2: '7%', width: '38%', height: '38%'}, 176 {x2: '7%', y2: '7%', width: '38%', height: '38%'} 177 ], 178 tooltip: { 179 formatter: 'Group {a}: ({c})' 180 }, 181 xAxis: [ 182 {gridIndex: 0, min: 0, max: 20}, 183 {gridIndex: 1, min: 0, max: 20}, 184 {gridIndex: 2, min: 0, max: 20}, 185 {gridIndex: 3, min: 0, max: 20} 186 ], 187 yAxis: [ 188 {gridIndex: 0, min: 0, max: 15}, 189 {gridIndex: 1, min: 0, max: 15}, 190 {gridIndex: 2, min: 0, max: 15}, 191 {gridIndex: 3, min: 0, max: 15} 192 ], 193 series: [ 194 { 195 name: 'I', 196 type: 'scatter', 197 xAxisIndex: 0, 198 yAxisIndex: 0, 199 data: data[0], 200 markLine: markLineOpt 201 }, 202 { 203 name: 'II', 204 type: 'scatter', 205 xAxisIndex: 1, 206 yAxisIndex: 1, 207 data: data[1], 208 markLine: markLineOpt 209 }, 210 { 211 name: 'III', 212 type: 'scatter', 213 xAxisIndex: 2, 214 yAxisIndex: 2, 215 data: data[2], 216 markLine: markLineOpt 217 }, 218 { 219 name: 'IV', 220 type: 'scatter', 221 xAxisIndex: 3, 222 yAxisIndex: 3, 223 data: data[3], 224 markLine: markLineOpt 225 } 226 ] 227 }; 228 return option; 229 } 230 }, 231 //图形展示 232 //参数:图形option、图形显示区域id 233 RenderChart: function (option, containerId) { 234 var container = eval("document.getElementById('" + containerId + "');");//获取图形显示区域 235 var myChart = echarts.init(container); 236 myChart.setOption(option);// 为echarts对象加载数据 237 } 238 };
View Code

这个实现了对ECharts的封装,在前端调用代码如下:

1、先定义一块区域用于显示图形

1     
2     <div id="container1" style="height: 400px">div>

2、引入需要的脚本,一个是原生的ECharts脚本库,一个是自己封装的。

1     
2     

3、使用封装的ECharts代码如下:

  先定义需要的数据,在传入生成图形需要的参数,最后展现图形。

 1     

整个项目代码在github上:https://github.com/yangtzeyufei/MyEcharts

欢迎大家共同参与。

其他:Echart官网

 

转载于:https://www.cnblogs.com/leanfish/p/6682946.html

你可能感兴趣的:(javascript,前端,数据库)