封装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 ...
随机推荐
- STM32F4的FPU单元讲解
搞STM32F407单片机的时候 看见的关于STM32F4系列的FPU 单元讲解 比较精彩的博客 于是特意转载 和大家分享 转自:http://blog.renren.com/blog/256814 ...
- 每天一个Linux命令(18)--locate命令
locate让使用者可以很快速的搜寻档案系统内是否有指定的档案.器方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就需查询这个数据库,而不必实际深入档案系统之中了.在一般的 ditr ...
- 项目架构开发:数据访问层之Logger
接上文 项目架构开发:数据访问层之Cache 本章我们继续ILogger的开发 ILogger.cs public interface ILogger { void Info(object messa ...
- Asp.Net MVC 之 Autofac 初步使用2 集成mvc 属性注入以及自动注入
首先看下Demo2的结构 然后下面一步步将Autofac集成到mvc中. 首先,定义Model Product.cs public class Product { public int Id ...
- Array对象方法属性总结
属性主要有三个:constructor;length;prototype; constructor(英文意思:构造器):返回对创建此对象的数组函数的引用.例如:var arr=new Array(); ...
- 联网html引用BootStrap
以下是我写的一个联网html引用BootStrap的例子,可作为参考: <%@ Page Language="C#" AutoEventWireup="true&q ...
- String类的indexOf方法的用法和举例
2017年3月3号博主第一次去郑州互联网公司面试,背景是这样的我先前去了农大龙子湖校园招聘投简历,然后第二天去面试了那经历可以说是很失败的一次面试,当然这跟自己的水平有关了接下来重点讲一下面试的题目: ...
- how to use Prolog in C#? SWI-Prolog
上个月突然看到Prolog这门语言,它特殊的语法吸引了我,但是经过我一段时间的学习,发现它也不像网络上传说的那样神奇,不过我依然对它很感兴趣,有前辈说Prolog本身并不强大,但是用来作为一门辅助语言 ...
- SQL基本用法-行转列
/* SELECT <非透视的列>, [第一个透视的列] AS <列名称>, [第二个透视的列] AS <列名称>, ... [最后一个透视的列] AS <列 ...
- MySQL查询语句的45道练习
一.设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四) ...