封装Echarts
项目中需要对数据进行图形展示,例如展示柱状图、饼状图等。这类的前端展示脚本很多,常见的是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的更多相关文章
- react-native中使用Echarts,自己使用WebView封装Echarts经验
1.工作中遇到的问题 我们在使用react-native肯定遇到过各种奇葩的问题,比如引入Echarts时候莫名报错,但是Echarts官网明显告诉我们可以懒加载的,这是因为基本上js大部分原生的组件 ...
- vue学习【一】vue引用封装echarts并展示多个echarts图表
大家好,我是一叶,经过一段时间对vue的学习,我打算把vue做一个系列,把踩过的坑和大家分享一下. 现在开始第一章:vue引用并封装echarts 在文章开始前,我先舔波echarts(真香).阿里的 ...
- 在vue项目中封装echarts的正确姿势
为什么需要封装echarts 每个开发者在制作图表时都需要从头到尾书写一遍完整的option配置,十分冗余 在同一个项目中,各类图表设计十分相似,甚至是相同,没必要一直做重复工作 可能有一些开发者忘记 ...
- 使用angular封装echarts
Echarts是一个开源的图表组件,图表比较丰富,工作中需要用到它来搭建一个数据展示系统.但是系统原有的框架是基于angular的,而echarts是基于原生js的,如果直接使用的话就丢失了angul ...
- 【小程序】---- 封装Echarts公共组件,遍历图表实现多个饼图
一.问题描述: 在小程序的项目中,封装公共的饼图组件,并在需要的页面引入使用.要求一个页面中有多个饼图,动态渲染不同的数据. 二.效果实现: 1. 查看——小程序使用Echarts的方式 2. 封装饼 ...
- angularf封装echarts
前言:angular中快速使用echarts 在html使用ehart很简单,你只需要引入文件和按照官方例子按照对应参数配置和数据填充就Ok了,那么在angular中怎么使用eharts(可以使用ec ...
- Vue + Element-ui实现后台管理系统(4)---封装一个ECharts组件的一点思路
封装一个ECharts组件的一点思路 有关后台管理系统之前写过三遍博客,看这篇之前最好先看下这三篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-system ...
- NodeJS + React + Webpack + Echarts
最近画了个简单的前端图,使用百度的echarts,基于原来项目的NodeJS+React+Webpack框架.在此记录一下: 1. 在react里封装echarts组件,并调用后端API. (参考的 ...
- 对echarts的简单封装
看了echarts的官网介绍:http://echarts.baidu.com/doc/example.html 看了网上人使用js对echarts的封装:http://blog.csdn.net/x ...
随机推荐
- c++针对数据库,文件的操作总结(原始)
1.将文件保存到sqlserver数据库的相关操作: Update t1 .txt’, SINGLE_BLOB ) Select convert( varchar(), data ) 注:fileTy ...
- MySQL账户管理
body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...
- 学习笔记——Java内部类练习题
1.尝试在方法中编写一个匿名内部类. package com.lzw; public class AnonymityInnerClass { } class OuterClass4{ public O ...
- 【CNMP系列】CNMP之路,系统起步。
简单的来理解,我所说的CNMP,不是CNM+P,而是CentOs+Nginx+MySql+PHP,也可以单纯的理解为LNMP,但是系统是我们自己选的,虽说是Linux的一个分支,但我就喜欢CentOs ...
- C#语言基础——定义变量、变量赋值、输入输出
第一部分 了解c# 一.C#的定义及其特点 C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.net的应用而开发的语言.它吸收了c++.Visual basi ...
- Java(基础)的类与变量
Java的类与成员变量 在我们学习编程语言中,需要灵活自用,那么怎么来灵活的将所有的函数属性来调用来实现完整的工程呢? 所以我们需要认识到类和变量的定义 1.类是什么? 类是抽象的概念,而对象就是类的 ...
- BigInteger和BigDecimal的练习
前言: BigInteger用于处理大数据的计算,它继承自java.math.BigInteger.用法相对来说比较简单,掌握几个基本运算即可. 初始化: BigInteger sum=new Big ...
- 百度地图API-覆盖物
这两天一直在研究百度地图开放平台的各种好玩的东西,闲暇之余自己动手体验了一番,果然是妙趣横生,而且还可以自定义理想中的地图,不得不说,百度地图的开放平台为我们的应用提供了很多的便利,之前我们已经学习了 ...
- ubuntu中文输入问题
因为硬盘版的一些缺陷,我狠心的把windows8覆盖为ubuntu 13.10,用u盘安装,除了分区稀里糊涂的还不知到怎么分,其他问题就是汉字的输入问题了,因为之前选了english-US 后来就没有 ...
- 你可记得曾经的-------- C#面向对象的“基础”
1.C#中构造函数定义的理解: ①构造函数名与所在的类名相同 ②构造函数可以重载 ③构造函数可以带参数 ④构造函数没有返回值,且不允许写出void,可以有参也可以无参 ...