封装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 ...
随机推荐
- tornado学习 - TCPServer 实现聊天功能
最近学习tornado框架,其中有很多值得学习的模块,鉴于某位学长的建议,也决定好好看看tornado.tcpserver. 关于TCP协议详细介绍可查阅wiki. 对于TCP服务器,基本的操作tor ...
- YoMail 邮箱客户端的社会化之路,起于邮箱,不止于邮件
你还记不记得上一次用邮箱处理私人事务是什么时候?从什么时候开始邮箱于你而言,唯一功能沦为了收取各种网站的验证信息? 电子邮件实际上非常适合于工作上使用,比起其他通信工具,或者社会化媒体,电子邮件在工作 ...
- EFcore与动态模型(三)
紧接着上面的内容,我们继续看下动态模型页面交互实现方式,内容如下: 1,如何实现动态表单 2,如何接收表单数据并绑定到动态模型上 一.如何实现动态表单 由于模型信息都是后台自定义配置的,并不是固定不变 ...
- MD5算法学习整理
一路学来 记得笔记不少 但是给自己看 当时就记得很随意 以为后面都懂 但还是太单纯了,现在回顾 自己都完全看不下去,所以以后的都放的博客上,让自己看懂,让感兴趣的看懂,详细,暴力 不废话了 MD5算法 ...
- WEB标准了解
今天看到朋友的简历有一项“了解WEB标准”,就特地了解了一下什么是WEB标准.现在就一项一项地解开自己的疑惑. 1.什么是WEB标准 WEB标准大部分由万维网组织(W3C)制定的WEB程序开发规范.W ...
- 构建Docker平台【第四篇】创建服务及扩缩容等操作
第一步:创建服务 1. 配置 nginx 的 yaml 文件 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-ng ...
- Java的容器类小结
Java的容器类其实就是集合类,只是为了不与Collection接口混淆,国内基本翻译为容器类. 容器类分为两种:独立元素序列的Collection和键值对的Map. Collection主要有如下几 ...
- 2017-02-23 switch case 循环语句
另一个分支语句:switch..case.. switch(变量){ case 值:代码段;break; case 值:代码段;break; ... default:代码段;b ...
- Objective-C日记-Bounds和Frame
今天在学习有关UIView时,关于Bounds和Frame的问题困扰多时,今日研究了一翻,有所收获,遂记之. 一.问题来源 网上有关bounds和frames的比较的文章主要就是一篇:http://b ...
- 每天一个Linux命令 2
wc 命令用于统计指定文本的行数.字数.字节数.格式为“wc [参数] 文本” . 参数 作 ...