项目中需要对数据进行图形展示,例如展示柱状图、饼状图等。这类的前端展示脚本很多,常见的是HighCharts和Echarts。HighCharts是基于svg技术的,而echarts基于Echarts,两者技术基础完全不一样,各有特点。而后者是可以在浏览器实现3D图形的。在各种图形展示上基本是差不多,都能满足项目需要。但是HighCharts是收费的,而Echarts是开源免费的,如果用于实际的项目还是使用Echarts。

  使用这类前端脚本,每种图形都需要写很多重复的脚本,复用性低,其实可以将相同的代码进行封装,方便重复使用。之前使用HighCharts时,封装了一个,使用C#和数据库,只需要在数据库中配置Sql语句即可,不需要修改大量的代码。但是使用不方便,需要配置多个表。

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

 var MyECharts = {
     //格式化数据
     ChartDataFormate: {
         FormateNOGroupData: function (data) {
             var categories = [];
             var datas = [];
             for (var i = 0; i < data.length; i++) {
                 categories.push(data[i].name || '');
                 temp_series = { value: data[i].value || 0, name: data[i].name };
                 datas.push(temp_series);
             }
             return { category: categories, data: datas };
         },
         //处理分组数据,数据格式:group:XXX,name:XXX,value:XXX用于折线图、柱形图(分组,堆积)
         //参数:数据、展示类型
         FormatGroupData: function (data, type) {
             var groups = new Array();
             var names = new Array();
             var series = new Array();
             for (var i = 0; i < data.length; i++) {
                 if (!groups.contains(data[i].group)) {
                     groups.push(data[i].group);
                 }
                 if (!names.contains(data[i].name)) {
                     names.push(data[i].name);
                 }
             }
             for (var i = 0; i < groups.length; i++) {
                 var temp_series = {};
                 var temp_data = new Array();
                 for (var j = 0; j < data.length; j++) {
                     for (var k = 0; k < names.length; k++)
                         if (groups[i] == data[j].group && data[j].name == names[k])
                             temp_data.push(data[j].value);
                     }
                     temp_series = { name: groups[i], type: type, data: temp_data };
                     series.push(temp_series);
                 }
                 return { category: names, series: series };
             }
         },
     //生成图形
     ChartOptionTemplates: {
         //柱状图
         Bar: function (title, subtext, data) {
             var datas = MyECharts.ChartDataFormate.FormatGroupData(data, 'bar');
             var option = {
                 title: {
                     text: title || '',
                     subtext: subtext || '',
                     x: 'center'
                 },
                 tooltip: {
                     show: true
                 },
                 xAxis: [
                 {
                     type: 'category',
                     data: datas.category
                 }
                 ],
                 yAxis: [
                 {
                     type: 'value'
                 }
                 ],
                 series: datas.series
             };
             return option;
         },
         //折线图
         Line: function (title, subtext, data) {
             var datas = MyECharts.ChartDataFormate.FormatGroupData(data, 'line');
             var option = {
                 title: {
                     text: title || '',
                     subtext: subtext || '',
                     x: 'center'
                 },
                 tooltip: {
                     show: true
                 },
                 xAxis: [
                 {
                     type: 'category',
                     data: datas.category
                 }
                 ],
                 yAxis: [
                 {
                     type: 'value'
                 }
                 ],
                 series: datas.series
             };
             return option;
         },
         //饼图
         Pie: function (title, subtext, data) {
             var datas = MyECharts.ChartDataFormate.FormateNOGroupData(data);
             var option = {
                 title: {
                     text: title || '',
                     subtext: subtext || '',
                     x: 'center'
                 },
                 tooltip: {
                     show: true,
                     trigger: 'item',
                     formatter: "{a} <br/>{b} : {c} ({d}%)"
                 },
                 legend: {
                     orient: 'vertical',
                     left: 'left',
                     data: datas.category
                 },
                 series: [
                 {
                     name: title,
                     type: 'pie',
                     radius: '55%',
                     center: ['50%', '60%'],
                     data: datas.data,
                     itemStyle: {
                         emphasis: {
                             shadowBlur: 10,
                             shadowOffsetX: 0,
                             shadowColor: 'rgba(0, 0, 0, 0.5)'
                         }
                     }
                 }
                 ]
             };
             return option;
         },
         //散点图
         Scatter: function (title, subtext, data) {
             var markLineOpt = {
                 animation: false,
                 label: {
                     normal: {
                         formatter: 'y = 0.5 * x + 3',
                         textStyle: {
                             align: 'right'
                         }
                     }
                 },
                 lineStyle: {
                     normal: {
                         type: 'solid'
                     }
                 },
                 tooltip: {
                     formatter: 'y = 0.5 * x + 3'
                 },
                 data: [[{
                     coord: [0, 3],
                     symbol: 'none'
                 }, {
                     coord: [20, 13],
                     symbol: 'none'
                 }]]
             };

             var option = {
                 title: {
                     text: 'Anscombe\'s quartet',
                     x: 'center',
                     y: 0
                 },
                 grid: [
                 {x: '7%', y: '7%', width: '38%', height: '38%'},
                 {x2: '7%', y: '7%', width: '38%', height: '38%'},
                 {x: '7%', y2: '7%', width: '38%', height: '38%'},
                 {x2: '7%', y2: '7%', width: '38%', height: '38%'}
                 ],
                 tooltip: {
                     formatter: 'Group {a}: ({c})'
                 },
                 xAxis: [
                     {gridIndex: 0, min: 0, max: 20},
                     {gridIndex: 1, min: 0, max: 20},
                     {gridIndex: 2, min: 0, max: 20},
                     {gridIndex: 3, min: 0, max: 20}
                 ],
                 yAxis: [
                     {gridIndex: 0, min: 0, max: 15},
                     {gridIndex: 1, min: 0, max: 15},
                     {gridIndex: 2, min: 0, max: 15},
                     {gridIndex: 3, min: 0, max: 15}
                 ],
                 series: [
                 {
                     name: 'I',
                     type: 'scatter',
                     xAxisIndex: 0,
                     yAxisIndex: 0,
                     data: data[0],
                     markLine: markLineOpt
                 },
                 {
                     name: 'II',
                     type: 'scatter',
                     xAxisIndex: 1,
                     yAxisIndex: 1,
                     data: data[1],
                     markLine: markLineOpt
                 },
                 {
                     name: 'III',
                     type: 'scatter',
                     xAxisIndex: 2,
                     yAxisIndex: 2,
                     data: data[2],
                     markLine: markLineOpt
                 },
                 {
                     name: 'IV',
                     type: 'scatter',
                     xAxisIndex: 3,
                     yAxisIndex: 3,
                     data: data[3],
                     markLine: markLineOpt
                 }
                 ]
             };
             return option;
         }
     },
     //图形展示
     //参数:图形option、图形显示区域id
     RenderChart: function (option, containerId) {
         var container = eval("document.getElementById('" + containerId + "');");//获取图形显示区域
         var myChart = echarts.init(container);
         myChart.setOption(option);// 为echarts对象加载数据
     }
 };

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

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

     <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
     <div id="container1" style="height: 400px"></div>

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

     <script src="MyECharts/resource/ECharts/echarts.js"></script>
     <script src="MyECharts/resource/MyECharts.js"></script>

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

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

     <script type="text/javascript">
         var data1 = [
             { group: 'Beijing', name: '1月', value: 10 },
             { group: 'Beijing', name: '2月', value: 15 },
             { group: 'Beijing', name: '3月', value: 12 },
             { group: 'Beijing', name: '4月', value: 14 },
             { group: 'Tokyo', name: '1月', value: 12 },
             { group: 'Tokyo', name: '2月', value: 15 },
             { group: 'Tokyo', name: '3月', value: 2 },
             { group: 'Tokyo', name: '4月', value: 14 }];

         var opt1 = MyECharts.ChartOptionTemplates.Bar('各个城市气温趋势', '°C', data1);
         MyECharts.RenderChart(opt1, 'container1');
     </script>

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

欢迎大家共同参与。

其他:Echart官网http://echarts.baidu.com/

封装Echarts的更多相关文章

  1. react-native中使用Echarts,自己使用WebView封装Echarts经验

    1.工作中遇到的问题 我们在使用react-native肯定遇到过各种奇葩的问题,比如引入Echarts时候莫名报错,但是Echarts官网明显告诉我们可以懒加载的,这是因为基本上js大部分原生的组件 ...

  2. vue学习【一】vue引用封装echarts并展示多个echarts图表

    大家好,我是一叶,经过一段时间对vue的学习,我打算把vue做一个系列,把踩过的坑和大家分享一下. 现在开始第一章:vue引用并封装echarts 在文章开始前,我先舔波echarts(真香).阿里的 ...

  3. 在vue项目中封装echarts的正确姿势

    为什么需要封装echarts 每个开发者在制作图表时都需要从头到尾书写一遍完整的option配置,十分冗余 在同一个项目中,各类图表设计十分相似,甚至是相同,没必要一直做重复工作 可能有一些开发者忘记 ...

  4. 使用angular封装echarts

    Echarts是一个开源的图表组件,图表比较丰富,工作中需要用到它来搭建一个数据展示系统.但是系统原有的框架是基于angular的,而echarts是基于原生js的,如果直接使用的话就丢失了angul ...

  5. 【小程序】---- 封装Echarts公共组件,遍历图表实现多个饼图

    一.问题描述: 在小程序的项目中,封装公共的饼图组件,并在需要的页面引入使用.要求一个页面中有多个饼图,动态渲染不同的数据. 二.效果实现: 1. 查看——小程序使用Echarts的方式 2. 封装饼 ...

  6. angularf封装echarts

    前言:angular中快速使用echarts 在html使用ehart很简单,你只需要引入文件和按照官方例子按照对应参数配置和数据填充就Ok了,那么在angular中怎么使用eharts(可以使用ec ...

  7. Vue + Element-ui实现后台管理系统(4)---封装一个ECharts组件的一点思路

    封装一个ECharts组件的一点思路 有关后台管理系统之前写过三遍博客,看这篇之前最好先看下这三篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-system ...

  8. NodeJS + React + Webpack + Echarts

    最近画了个简单的前端图,使用百度的echarts,基于原来项目的NodeJS+React+Webpack框架.在此记录一下: 1.  在react里封装echarts组件,并调用后端API. (参考的 ...

  9. 对echarts的简单封装

    看了echarts的官网介绍:http://echarts.baidu.com/doc/example.html 看了网上人使用js对echarts的封装:http://blog.csdn.net/x ...

随机推荐

  1. 1.5编程基础之循环控制44:第n小的质数

    #include<iostream>#include<cmath>using namespace std;int main(){ int n; cin>>n; in ...

  2. 为 instance 配置静态 IP - 每天5分钟玩转 OpenStack(157)

    这是 OpenStack 实施经验分享系列的第 7 篇. 传统运维中为服务器配置静态 IP 是再常见不过的了.但在 OpenStack 环境下只能指定 network,IP 都是 Neutron 从 ...

  3. 卷积神经网络(CNN)前向传播算法

    在卷积神经网络(CNN)模型结构中,我们对CNN的模型结构做了总结,这里我们就在CNN的模型基础上,看看CNN的前向传播算法是什么样子的.重点会和传统的DNN比较讨论. 1. 回顾CNN的结构 在上一 ...

  4. opensessioninviewFilter导致org.hibernate.NonUniqueObjectException

    起因: 公司业务需求,增加了一个新的数据源,增加之后,起初一切正常,但是发现后台管理系统所有Ajax请求获取信息没有问题,但是涉及到保存操作就抛出异常. 异常: org.hibernate.NonUn ...

  5. angular 2.0 关于新版angular-cli的应用

    1.以前写过一个webstorm借助angular-cli搭建angular2.0项目的博客. 后来许久没有接触过angular,现在拾起来的时候发现已经更新,用法变了.所以来记录下,以免其他友看到照 ...

  6. Java I/O之NIO Socket

    PS:本文简单介绍下旧I/O和NIO下的Socket通讯,仅以UDP来示例. TCP/IP协议 首先简单回顾下TCP/IP协议 Application:应用程序:Socket:套接字:Host:主机: ...

  7. php与mysql之间操作原理

    php和mysql相关扩展有:mysql.mysqli和pdo三种 mysql扩展从php5.5.0被废弃,并且从从php7.0.0开始被废除 mysql之前的使用---几个基本的函数:mysql_c ...

  8. Vue基本入门

    介绍 1.Vue.js是什么? Vue.js(读音:/vju:/,类似于view)是一套构建用户界面的渐进式框架,与其他重量级框架不同的是,Vue采用的是自底向上增量开发的设计. Vue的核心库只关注 ...

  9. C 风格字符串相加

    <<C++ Primer>> 第四版Exercise Section 4.3.1 的4.3.0 有如下题目:编写程序连接两个C风格字符串字面值,把结果存储在C风格字符串中.代码 ...

  10. C#与Java区别(一)

    最近学了点java,总结了一些和c#的语法区别,欢迎大家指点和补充,如下: 1.java支持跨平台,当然.net core现在也支持. 2.java中用package,c#中用namespace定义空 ...