Extjs根据store 动态创建图表

来源:互联网 发布:海报字体设计软件 编辑:程序博客网 时间:2024/04/28 01:42
  1. /** 
  2.  * Extjs4 动态创建图表 
  3.  * author:shangql 
  4.  * date:2012.12.12 
  5.  */  
  6.   
  7. /** 
  8.  * 判断空如果为空返回true 
  9.  *  
  10.  * @param obj 
  11.  * @returns {Boolean} 
  12.  */  
  13. function isEmpty(obj){  
  14.     if(typeof(obj) == 'undefined' || obj == ''){   
  15.         return true;  
  16.     }  
  17. }  
  18.   
  19.   
  20.   
  21.   
  22. /** 
  23.  * 创建刻度引用字段 
  24.  * @param num 
  25.  * @returns {Array} 
  26.  */  
  27. function newNumericFields(num){  
  28.     var fieldsArr = new Array();  
  29.     for ( var i = 1; i <= num; i++) {  
  30.         fieldsArr.push('data'+i);  
  31.     }  
  32.     return fieldsArr;  
  33. }  
  34.   
  35. /** 
  36.  * 创建数据集引用字段 
  37.  * @param num 
  38.  * @returns {Array} 
  39.  */  
  40. function newStoreFields(num){  
  41.     var fieldsArr = new Array();  
  42.     fieldsArr.push("name");  
  43.     for ( var i = 1; i <= num; i++) {  
  44.         fieldsArr.push('name'+i);  
  45.         fieldsArr.push('data'+i);  
  46.     }  
  47.     return fieldsArr;  
  48. }  
  49.   
  50.   
  51. /** 
  52.  * 创建Y坐标轴 
  53.  *  
  54.  * @param position 
  55.  *            坐标轴显示位置(left;right) 
  56.  * @returns 坐标轴对象 
  57.  */  
  58. function newNumeric(position){  
  59.     var Numeric = {   
  60.         type: 'Numeric',  
  61.         minimum: 0,  
  62.         position: position,  
  63.         fields: ['data1','data2','data3','data4','data5','data6','data7','data8','data9'],  
  64.         minorTickSteps: 9,  
  65.         majorTickSteps:9,  
  66.         grid: {  
  67.             odd: {  
  68.                 opacity: 1,  
  69.                 fill: '#ddd',  
  70.                 stroke: '#bbb',  
  71.                 'stroke-width': 0.5  
  72.             }  
  73.         },  
  74.         grid:true,  
  75.         label:{  
  76.              renderer:function(v){  
  77.                 return Ext.util.Format.round(v,2);  
  78.             },  
  79.            font: '10px Arial'  
  80.             }  
  81.         };  
  82.         return Numeric;  
  83. }  
  84.   
  85. /** 
  86.  * 创建X坐标轴 
  87.  *  
  88.  * @param position 
  89.  *            坐标轴显示位置(top;bottom) 
  90.  * @param title 
  91.  *            坐标轴显示标题(可以是'') 
  92.  * @returns 坐标轴对象 
  93.  */  
  94. function newCategory(position,title){  
  95.     var Category = {  
  96.         type: 'Category',  
  97.         position: position,  
  98.         title: title,  
  99.         fields: ['name'],  
  100.         label: {  
  101.             font: '9px Chancery'  
  102.             }  
  103.         };  
  104.         return Category;  
  105. }  
  106.   
  107. /** 
  108.  * 创建柱 
  109.  * @param position 线的轴刻度显示位置(left;right) 
  110.  * @param tips 鼠标滑过图表显示的lable引用的字段 
  111.  * @param title 图表图例汉字标题 
  112.  * @param renderer 鼠标滑过图表显示的lable的单位 
  113.  * @returns 柱形对象 
  114.  */  
  115. function newColumn (position,tips,title,renderer){  
  116.     var column = {  
  117.         type: 'column',  
  118.         axis: position,  
  119.         highlight: {  
  120.             stroke:'green'  
  121.             },  
  122.         tips: {  
  123.           trackMouse: true,  
  124.           width: 140,  
  125.           height: 28,  
  126.           renderer: function(storeItem, item) {  
  127.             if(isEmpty(renderer)){  
  128.                 this.setTitle(storeItem.get('name') + ': ' + storeItem.get(tips));    
  129.             }else{  
  130.                 this.setTitle(storeItem.get('name') + ': ' + storeItem.get(tips) + renderer );  
  131.             }  
  132.           }  
  133.         },  
  134.         style:{  
  135.             width:40  
  136.         },  
  137.         label: {  
  138.           display: 'insideEnd',  
  139.           'text-anchor''middle',  
  140.             field: '',  
  141.             renderer: Ext.util.Format.numberRenderer('0'),  
  142.             orientation: 'vertical',  
  143.             color: '#333'  
  144.         },  
  145.         title:title,  
  146.         xField: 'name',  
  147.         yField: tips  
  148.         };  
  149.     return column;  
  150. }  
  151.   
  152. /** 
  153.  * 创建线 
  154.  * @param position 线的轴刻度显示位置(left;right) 
  155.  * @param tips 鼠标滑过图表显示的lable引用的字段 
  156.  * @param title 图表图例汉字标题 
  157.  * @param renderer 鼠标滑过图表显示的lable的单位 
  158.  * @returns 线形对象 
  159.  */  
  160. function newLine (position,tips,title,renderer){  
  161.     var line = {  
  162.         type: 'line',  
  163.         highlight: {  
  164.             size: 7,  
  165.             radius: 7  
  166.         },  
  167.         axis: position,  
  168.         smooth: true,  
  169.         fill: false,  
  170.         title:title,  
  171.         xField: 'name',  
  172.         yField: tips,  
  173.         markerConfig: {  
  174.             type: 'circle',  
  175.             size: 4,  
  176.             radius: 4,  
  177.             'stroke-width': 0  
  178.         },  
  179.         style: {  
  180.             'stroke-width': 3,  
  181.             fill: false,  
  182.             opacity: 0.2  
  183.         },  
  184.         tips: {  
  185.               trackMouse: true,  
  186.               width: 140,  
  187.               height: 28,  
  188.               renderer: function(storeItem, item) {  
  189.                 if(isEmpty(renderer)){  
  190.                     this.setTitle(storeItem.get('name') + ': ' + storeItem.get(tips));    
  191.                 }else{  
  192.                     this.setTitle(storeItem.get('name') + ': ' + storeItem.get(tips) + renderer );  
  193.                     }  
  194.                   }  
  195.             }  
  196.         };  
  197.     return line;  
  198. }  
  199.   
  200.   
  201. /** 
  202.  * 画图表 
  203.  * @param store 数据集 
  204.  * @param category 样式种类 
  205.  * @param title 标题 
  206.  * @param seriesType 图表类型 column;line(暂时 只支持 柱形,线形) 
  207.  * @param renderer 渲染单位 可以为'' 
  208.  * @returns 
  209.  */  
  210. function drawChart(store,category,title,seriesType,renderer){  
  211.     // 轴线数组  
  212.     var axes = new Array();  
  213.     // 图表类型数组  
  214.     var series = new Array();  
  215.       
  216.     //============实例化轴============  
  217.     // y左坐标轴  
  218.     var leftNumeric = newNumeric('left');  
  219.     var bottomTitle = title + "分析指标";  
  220.     // x底部坐标轴  
  221.     var bottomCategory = newCategory('bottom',bottomTitle);  
  222.       
  223.     // 添加到轴线数组,y左右坐标轴  
  224.     axes.push(leftNumeric);  
  225.     axes.push(bottomCategory);  
  226.       
  227.     //判断图表类型  
  228.     if(seriesType == 'column'){  
  229.         // 实例化柱形图  
  230.         var column = newColumn('left','data1',title,renderer);  
  231.         series.push(column);  
  232.     }else if(seriesType == 'line'){  
  233.         // 实例化线形图  
  234.         var line = newLine('left','data1',title,renderer);  
  235.         series.push(line);  
  236.     }  
  237.       
  238.       
  239.     // 创建图表对象  
  240.     var chart = Ext.create('Ext.chart.Chart', {  
  241.         xtype: 'chart',  
  242.         width: $(window).width(),  
  243.         height: $(window).height() * 0.9,  
  244.         style: 'background:#fff',  
  245.         animate: true,  
  246.         shadow: false,  
  247.         store: store,  
  248.         theme: category,  
  249.         insetPadding: 50,  
  250.         legend: {  
  251.             position: 'right'  
  252.         },  
  253.         axes: axes,  
  254.         series: series  
  255.     });   
  256.       
  257.    // 返回图表对象  
  258.    return chart;   

原创粉丝点击