Extjs 根据 store返回数据 动态创建图表

根据store后台返回数据,动态创建图表类型,以及图表对象中包括的柱形,线性等等对象。暂时只支持柱形、和线性图表。

/**
* Extjs4 动态创建图表
* author:shangql
* date:2012.12.12
*/

/**
* 判断空如果为空返回true
*
* @param obj
* @returns {Boolean}
*/
function isEmpty(obj){
if(typeof(obj) == 'undefined' || obj == ''){
return true;
}
}


/**
* 创建刻度引用字段
* @param num
* @returns {Array}
*/
function newNumericFields(num){
var fieldsArr = new Array();
for ( var i = 1; i <= num; i++) {
fieldsArr.push('data'+i);
}
return fieldsArr;
}

/**
* 创建数据集引用字段
* @param num
* @returns {Array}
*/
function newStoreFields(num){
var fieldsArr = new Array();
fieldsArr.push("name");
for ( var i = 1; i <= num; i++) {
fieldsArr.push('name'+i);
fieldsArr.push('data'+i);
}
return fieldsArr;
}


/**
* 创建Y坐标轴
*
* @param position
* 坐标轴显示位置(left;right)
* @returns 坐标轴对象
*/
function newNumeric(position){
var Numeric = {
type: 'Numeric',
minimum: 0,
position: position,
fields: ['data1','data2','data3','data4','data5','data6','data7','data8','data9'],
minorTickSteps: 9,
majorTickSteps:9,
grid: {
odd: {
opacity: 1,
fill: '#ddd',
stroke: '#bbb',
'stroke-width': 0.5
}
},
grid:true,
label:{
renderer:function(v){
return Ext.util.Format.round(v,2);
},
font: '10px Arial'
}
};
return Numeric;
}

/**
* 创建X坐标轴
*
* @param position
* 坐标轴显示位置(top;bottom)
* @param title
* 坐标轴显示标题(可以是'')
* @returns 坐标轴对象
*/
function newCategory(position,title){
var Category = {
type: 'Category',
position: position,
title: title,
fields: ['name'],
label: {
font: '9px Chancery'
}
};
return Category;
}

/**
* 创建柱
* @param position 线的轴刻度显示位置(left;right)
* @param tips 鼠标滑过图表显示的lable引用的字段
* @param title 图表图例汉字标题
* @param renderer 鼠标滑过图表显示的lable的单位
* @returns 柱形对象
*/
function newColumn (position,tips,title,renderer){
var column = {
type: 'column',
axis: position,
highlight: {
stroke:'green'
},
tips: {
trackMouse: true,
width: 140,
height: 28,
renderer: function(storeItem, item) {
if(isEmpty(renderer)){
this.setTitle(storeItem.get('name') + ': ' + storeItem.get(tips));
}else{
this.setTitle(storeItem.get('name') + ': ' + storeItem.get(tips) + renderer );
}
}
},
style:{
width:40
},
label: {
display: 'insideEnd',
'text-anchor': 'middle',
field: '',
renderer: Ext.util.Format.numberRenderer('0'),
orientation: 'vertical',
color: '#333'
},
title:title,
xField: 'name',
yField: tips
};
return column;
}

/**
* 创建线
* @param position 线的轴刻度显示位置(left;right)
* @param tips 鼠标滑过图表显示的lable引用的字段
* @param title 图表图例汉字标题
* @param renderer 鼠标滑过图表显示的lable的单位
* @returns 线形对象
*/
function newLine (position,tips,title,renderer){
var line = {
type: 'line',
highlight: {
size: 7,
radius: 7
},
axis: position,
smooth: true,
fill: false,
title:title,
xField: 'name',
yField: tips,
markerConfig: {
type: 'circle',
size: 4,
radius: 4,
'stroke-width': 0
},
style: {
'stroke-width': 3,
fill: false,
opacity: 0.2
},
tips: {
trackMouse: true,
width: 140,
height: 28,
renderer: function(storeItem, item) {
if(isEmpty(renderer)){
this.setTitle(storeItem.get('name') + ': ' + storeItem.get(tips));
}else{
this.setTitle(storeItem.get('name') + ': ' + storeItem.get(tips) + renderer );
}
}
}
};
return line;
}


/**
* 画图表
* @param store 数据集
* @param category 样式种类
* @param title 标题
* @param seriesType 图表类型 column;line(暂时 只支持 柱形,线形)
* @param renderer 渲染单位 可以为''
* @returns
*/
function drawChart(store,category,title,seriesType,renderer){
// 轴线数组
var axes = new Array();
// 图表类型数组
var series = new Array();

//============实例化轴============
// y左坐标轴
var leftNumeric = newNumeric('left');
var bottomTitle = title + "分析指标";
// x底部坐标轴
var bottomCategory = newCategory('bottom',bottomTitle);

// 添加到轴线数组,y左右坐标轴
axes.push(leftNumeric);
axes.push(bottomCategory);

//判断图表类型
if(seriesType == 'column'){
// 实例化柱形图
var column = newColumn('left','data1',title,renderer);
series.push(column);
}else if(seriesType == 'line'){
// 实例化线形图
var line = newLine('left','data1',title,renderer);
series.push(line);
}


// 创建图表对象
var chart = Ext.create('Ext.chart.Chart', {
xtype: 'chart',
width: $(window).width(),
height: $(window).height() * 0.9,
style: 'background:#fff',
animate: true,
shadow: false,
store: store,
theme: category,
insetPadding: 50,
legend: {
position: 'right'
},
axes: axes,
series: series
});

// 返回图表对象
return chart;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值