javascript smipleChart 简单图标类


Posted in Javascript onJanuary 12, 2011

因为编辑器会对代码有所破坏,所以提供一个在线演示
http://demo.3water.com/chengxu/smipleChart.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>smipleChart</title> 
<style type="text/css"> .cc{ 
height:450px; width:800px; border:1px solid #999; position:relative; margin:20px; 
} 
</style> 
</head> 
<body> 
<div id='t'></div> 
<div id='t1'> 
</div> 
<div id='line' class="cc"></div> 
<div id='area' class="cc"></div> 
<div id='zhu' class="cc"></div> 
<div id='zhu1' class="cc" style="height:600px;"></div> 
<div id='pie' class="cc"></div> 
<div id='pies' class="cc"></div> 
<div id='segment' class="cc"></div> 
<div id='vv' class="cc" style='height:300px; width:520px;'></div> 
<script type="text/javascript"> 
(function(doc,undefined){ 
var win = this, 
hasSVG = win.SVGAngle || doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"), 
isIE = /msie/i.test(navigator.userAgent) && !win.opera, 
path = hasSVG?'d':'path', 
seal = hasSVG?'z':'e', 
math = Math, 
mathRound = math.round, 
mathFloor = math.floor, 
mathCeil = math.ceil, 
mathMax = math.max, 
mathMin = math.min, 
mathAbs = math.abs, 
mathCos = math.cos, 
mathSin = math.sin, 
M = 'M', 
L = 'L'; 
win.$ = function(Id){ 
return document.getElementById(Id); 
}; 
win.extend = function(){ 
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = true, options; 
if ( typeof target === "boolean" ) { 
deep = target; 
target = arguments[1] || {}; 
i = 2; 
} 
if ( typeof target !== "object" && Object.prototype.toString.call(target)!="[object Function]") 
target = {}; 
for(;i<length;i++){ 
if ( (options = arguments[ i ]) != null ) 
for(var name in options){ 
var src = target[ name ], copy = options[ name ]; 
if ( target === copy ) 
continue; 
if ( deep && copy && typeof copy === "object" && !copy.nodeType ){ 
target[ name ] = arguments.callee( deep, src || ( copy.length != null ? [ ] : { } ), copy ); 
} 
else if(copy !== undefined) 
target[ name ] = copy; 
} 
} 
return target; 
}; 
win.each = function ( object, callback, args ) { 
var name, i = 0, length = object.length; 
if ( args ) { 
args = Array.prototype.slice.call(arguments).slice(2); 
if ( length === undefined ) { 
for ( name in object ) 
if ( callback.apply( object[ name ],[name,object[ name ]].concat(args) ) === false ) 
break; 
} else 
for ( ; i < length; i++) 
if ( callback.apply( object[ i ],[i,object[ i ]].concat(args)) === false ) // 
break; 
} else { 
if ( length === undefined ) { 
for ( name in object ) 
if ( callback.call( object[ name ], name, object[ name ] ) === false ) 
break; 
} else 
for ( var value = object[0]; 
i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} 
} 
return object; 
}; 
//--------------------------------------------------------------- 
function processPoint( x ){ 
return isIE ? ~~x.toFixed(0) : ~~x.toFixed(0) + 0.5; 
}; 
function calTextLen(txt, cssStr){ 
var span = doc.createElement('span'); 
if(cssStr){ 
typeof cssStr === 'string' 
? span.style.cssText = cssStr 
: extend(span.style,cssStr); 
}else{ 
extend(span.style,{ 
fontSiz : '12px', 
fontFamily : '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif' 
}); 
} 
span.innerHTML = txt || ''; 
span.style.visibility = 'hidden'; 
doc.body.appendChild(span); 
var width = span.offsetWidth, 
height = span.offsetHeight; 
doc.body.removeChild(span); 
return {w:width,h:height}; 
}; 
function angle(r,center,o,jingdu){ 
var hudu = Math.PI*2*(o/360), 
x = center[0]+ r*Math.sin(hudu), 
y = center[1]+ -r*Math.cos(hudu); 
return [x.toFixed(jingdu||0),y.toFixed(jingdu||0)]; 
} 
function xx(a,b,lineNum){ 
var t = 10000; 
var stf = ((b*t-a*t)/lineNum)/t, 
arr = [1,2,2.5,5,10], 
c = 1, 
v; 
// 分割线的基数是 [1,2,2.5,5,10] 这个步骤是查找 间隔 属于哪个范围 
if(stf<arr[0]){ 
while( stf<arr[0] ){ 
c = c*10; 
arr[0]=arr[0]/c; 
} 
each([1,2,2.5,5,10],function(i,o){ 
arr[i]= o/c; 
}); 
}else if(stf>arr[4]){ 
while( stf>arr[4] ){ 
c = c*10; 
arr[4] = arr[4]*c; 
} 
each([1,2,2.5,5,10],function(i,o){ 
arr[i]= o*c; 
}); 
} 
//上面找到间隔后 找到间隔中最接近的一个 
each(arr,function(i,o){ 
if(stf<o){ 
v = o; 
return false; 
} 
}); 
//a 是最小的 
//b是最大 的 
a = (a*t-mathAbs((a%v)*t))/t; 
b = (b*t+(b%v===0?0:(v-b%v))*t)/t; 
//看看还剩几条线没有画 
var num = Math.max(0,lineNum - Math.round((b-a)/v)); 
if(a>=0){ 
//让图比较靠中间 
/*while(num!==0){ 
num%2===0 
? a = (a*t-v*t)/t 
: b = (b*t+v*t)/t; 
num--; 
}*/ 
//坐标比较整数化 
if(a!=0&&num!=0){ 
while(a!=0&&num!=0){ 
a = (a*t-v*t)/t; 
num--; 
if((a*t-v*num*t)/10000>0&&a%10===0) 
break; 
} 
} 
if(num!=0){ 
while(num!==0){ 
b = (b*t+v*t)/t 
num--; 
} 
} 
}else{ 
//让图比较靠中间 
/*while(num!==0){ 
num%2===0 
? b = (b*t+v*t)/t 
: a = (a*t-v*t)/t 
num--; 
}*/ 
//坐标比较整数化 
if(b<0&&num!=0){ 
while(b!=0&&num!=0){ 
b = (b*t+v*t)/t; 
num--; 
if((b*t+v*num*t)/t<0&&a%10===0) 
break; 
} 
} 
if(num!=0){ 
while(num!==0){ 
a = (a*t-v*t)/t 
num--; 
} 
} 
} 
return {min:a,max:b,stf:v}; 
} 
//--------------------------------------------------------------------------------------------------------------- 
//对svg vml元素的一些创建 修改属性 样式 删除 == 一些的操作 
win.vector = function(){}; 
win.vector.prototype = { 
$c : function(graphic,nodeName){ 
this.element = this[0] = doc.createElementNS('http://www.w3.org/2000/svg', nodeName); 
this.graphic = graphic; 
return this; 
}, 
attr: function(hash,val){ 
var elem = this.element, 
key, 
value; 
if(typeof hash === 'string'){ 
if(val === undefined){ 
return elem.getAttribute(hash); 
}else{ 
elem.setAttribute(hash, val); 
return this; 
} 
} else { 
for(key in hash){ 
value = hash[key]; 
if(key === path){ 
value && value.join 
&&(value = value.join(' ')); 
/(NaN| |^$)/.test(value) 
&&(value = 'M 0 0'); 
} 
elem.setAttribute(key, value) 
} 
} 
return this; 
}, 
css: function(hash){ 
var str = ''; 
for(var key in hash){ 
if(isIE && key == "opacity"){ 
this.element.style['filter'] = "alpha(opacity="+ hash[key] * 100+")"; 
}else{ 
this.element.style[key] = hash[key]; 
} 
} 
return this; 
}, 
on: function(eventName, handler){ 
var self = this; 
this.element.addEventListener(eventName,function(){ 
handler.call(self) 
},false); 
return this; 
}, 
appendTo: function(parent){ 
if(parent){ 
parent.element 
? parent.element.appendChild(this.element) 
: parent.appendChild(this.element) 
} else { 
this.graphic.container.appendChild(this.element); 
} 
return this; 
}, 
addText: function(str){ 
var elem = this.element; 
if(elem.nodeName === 'text'){ 
elem.appendChild(doc.createTextNode(str.toString() || ' ')); 
} 
return this; 
}, 
setOpacity : function(v){ 
this.attr('fill-opacity',v) 
}, 
toFront: function() { 
this.element.parentNode.appendChild(this.element) 
return this; 
}, 
show: function(){ 
this.element.style.display = 'block'; 
return this; 
}, 
hide: function(){ 
this.element.style.display = 'none'; 
return this; 
} 
}; 
//--------------------------------------------------------------------------------------------------------------- 

//--------------------------------------------------------------------------------------------------- 
//如果是vml修改其中的一些方法 
if(!hasSVG){ 
//-------------创建vml环境----------------- 
doc.createStyleSheet().addRule(".vml", "behavior:url(#default#VML);display:inline-block;position:absolute;left:0px;top:0px"); 
!doc.namespaces.vml && !+"\v1"; 
doc.namespaces.add("vml", "urn:schemas-microsoft-com:vml"); 
//-------------修改一些方法----------------- 
extend(vector.prototype,{ 
$c : function(graphic,nodeName){ 
var name = nodeName || 'shape'; 
this.element= this[0] = (name === 'div' || name === 'span') 
? doc.createElement(name) 
: doc.createElement('<vml:'+name+' class="vml">'); 
this.graphic = graphic; 
return this; 
}, 
on : function(eventName, handler){ 
var self = this; 
this.element.attachEvent("on" + eventName,function(){ 
handler.call(self); 
}); 
return this; 
}, 
addText : function(txt){ 
var elem = this.element; 
elem.innerHTML = txt || ''; 
return this; 
}, 
setOpacity : function(v){ 
this.opacity.opacity=v; 
} 
}); 
} 
//--------------------------------------------------------------------------------------------------- 



//画图类 
//------------------------------------------------------------ 
win.smipleChart = function(){ 
this.init.apply(this,arguments); 
}; 
smipleChart.prototype = { 
options : { 
charts : { 
paddingRight : 20, 
radius : 200, 
style : { 
fontFamily : '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif', 
fontSize : '12px', 
background : '#FFFFFF' 
} 
}, 
title : { 
text : '', 
y : 10, 
style : { 
fontFamily:'Verdana,Arial,Helvetica,sans-serif', 
fontSize:'16px', 
fontWeight:'bold' 
} 
}, 
subTitle : { 
text : '', 
y : 30, 
style : { 
fontFamily:'Verdana,Arial,Helvetica,sans-serif', 
fontSize:'12px', 
color: '#111' 
} 
}, 
yUnit : { 
text : '', 
style : { 
fontFamily:'Verdana,Arial,Helvetica,sans-serif', 
fontSize:'12px', 
color: '#111' 
}, 
lineNum :10 
} 
}, 
init : function(container,options,width,height){ 
this.width = width || container.offsetWidth; 
this.height = height || container.offsetHeight; 
this.mainGroup = {}; 
//svg 里面画图 必须有一个svg标签 vml就用div了 
this.container = hasSVG 
? new vector().$c(1,'svg') 
.attr({ 
xmlns : 'http://www.w3.org/2000/svg', 
version : '1.1' 
}) 
.css({fontSize : '12px'}) 
.appendTo(container).element 
: new vector().$c(1,'div') 
.css({ 
fontSize : '12px', 
width : this.width +'px', 
height : this.height+'px' 
}) 
.appendTo(container).element; 
var c = extend(true,{},this.options) 
var opts = this.opts = extend(true,c,options), 
style = extend(opts.charts.style,{ 
width : this.width, 
height : this.height 
}); 

//计算绘画盘子的时候需要的一些参数 
this.getDrawArea() 
.createTooltip() //创建提示信息的框框 
.drawTitle() //画标题 
//画盘子 
if('line,area,pie'.indexOf(opts.charts.type)>=0){ 
opts.charts.panel = 'x'; 
} 
if(' pie,pies'.indexOf(opts.charts.type)<0){ 
this.drawPanel(); 
} 
this.drawLegend(opts.legend.type); //画色块条 
var type = { 
line : 'drawLine', 
area : 'drawArea', 
columns : 'drawColumns', 
pie : 'drawPie', 
pies : 'drawPies', 
segment : 'drawSegment' 
}[opts.charts.type]; 
this[type](); 
}, 
createElement : function(nodeName){ 
return new vector().$c(this,nodeName); 
}, 
group: function(name){ 
return this.createElement(isIE?'div':'g').attr('mark',name); 
}, 
getDrawArea : function(){ 
var opts = this.opts, 
width = this.width, 
height = this.height, 
title = opts.title, 
subTitle = opts.subTitle, 
area = { 
// 去掉坐标轴左边的刻度文本宽度(预估) 80为定值 左边只留80的间距 
areaWidth : width - 80, 
// 去掉坐标轴底下的文本和标线的高度 
areaHeight : height - 40, 
//原点的X位置 下面会计算到 
startX : 0, 
//原点的Y位置 下面会计算到 
startY : 0, 
//中心的x坐标 画饼图的时候需要知道圆心的位置 
centerX: 0, 
//中心的y坐标 画饼图的时候需要知道圆心的位置 
centerY: 0 
}; 
//如果主标题存在 减去主标题的高度 否则 减去10的高 
area.areaHeight -=(title.text !== '') 
? title.y 
: 10; 
// 去掉副标题高度 
area.areaHeight -=(subTitle.text !== '') 
? subTitle.y 
: 10 
area.startX = 80; 
area.startY = height - 40; 
//圆心的位置 
area.centerX = width / 2; 
area.centerY = height / 2; 
//右边留一些空隙 
area.areaWidth -=20; 
//上边也留一些间距 
area.areaHeight -=15; 
opts.area = area; 
return this; 
}, 
drawTitle : function(){ 
var opts = this.opts, 
self = this, 
arr = [opts.title,opts.subTitle,opts.yUnit], 
//3个标题坐标的位置的基本参数 
config = [ 
{ 
x : this.width / 2, 
y : opts.title.y 
}, 
{ 
x : this.width / 2, 
y : opts.subTitle.y 
}, 
{ 
x : opts.yUnit.x, 
y : this.height / 2 - 20 
} 
], 
tpanel = this.group('title') 
.appendTo(); 
each(arr,function(i,title){ 
var text = title.text; 
if(text){ 
var elem = self.baseDraw('span',{ 
'text-anchor':'left', 
x : mathMax(config[i].x - calTextLen(text,title.style).w/2,10), 
y : config[i].y 
},calTextLen(title.text,title.style).h) 
.css(title.style) 
.addText(text) 
.appendTo(tpanel); 
//如果为2的时候 就说明是副标题 将它竖过来 
if(i===2){ 
hasSVG 
? elem.attr({transform : 'rotate(270, '+(opts.yUnit.x+10)+', ' + self.height / 2 + ')'}) 
: (elem.element.style.filter ='progid:DXImageTransform.Microsoft.BasicImage(rotation=3)') 
} 
} 
}); 
return this; 
}, 

//画盘子 比较麻烦 
drawPanel : function(type){ 
var opts = this.opts, 
self = this, 
area = opts.area, 
isSegment= opts.charts.type==='segment', 
//盘子的类型 是横盘子 还是纵盘子 
type = opts.charts.panel || 'x'; 
// 底板 
var drawAreaWidth = area.areaWidth, 
drawAreaHeight = area.areaHeight, 
//原点的坐标 
startX = area.startX, 
startY = area.startY; 
var allData = [], 
minValue = 0, 
maxValue = 10, 
lineNum = mathMax(opts.yUnit.lineNum,2), 
min = opts.yUnit.min, 
staff; 
//组合所有的数据 
each(opts.chartData,function(i,o){ 
isSegment 
? each(o.data,function(j,d){ 
allData[j] 
? allData[j] = allData[j] + (~~d) 
: allData[j] = ~~d; 
}) 
: allData = allData.concat(o.data) 
}); 
//给所有的数据排序 为了下面求最大值 最小值 
allData.sort(function(a,b){return a-b}); 
//求出最大值 最小值 
maxValue = allData[allData.length - 1]; 
each(allData,function(i,o){ 
if(o){ 
minValue = o; 
return false; 
} 
}); 
//主盘子容器 
this.panel = this.group('panel').appendTo(); 

var dd = xx(minValue,maxValue,lineNum), 
min = dd.min, 
max = dd.max, 
f = dd.stf; 
//表示画的是横坐标 
if(type.toLowerCase()==='x'){ 
//横坐标单位间隔 
var xPices = drawAreaWidth / opts.xUnit.units.length, 
//单位间隔的中心点 
offset = xPices / 2, 
yPices = drawAreaHeight / lineNum; 

//--------------------------------画横向的点和文字--------------------------------------------------------- 
each(opts.xUnit.units,function(i,d){ 
self.baseDraw('path',{ 
border : 1, 
borderColor : '#C0C0C0', 
isfill : false, 
path : [ 
M, 
processPoint(startX + (i * xPices)), 
processPoint(startY), 
L, 
processPoint(startX + (i*xPices)), 
processPoint(startY + 5) 
] 
}). 
appendTo(self.panel); 
var y = hasSVG?5:10, 
span = self.baseDraw('span',{ 
x : startX + offset + (i * xPices), 
y : startY+y, 
'text-anchor':'middle' 
}) 
.css({ 
fontFamily:'Verdana,Arial,Helvetica,sans-serif', 
fontSize:'12px' 
}) 
.addText(opts.xUnit.units[i]) 
.appendTo(self.panel) 
.element; 
//vml没有x y的概念 所以要简单span宽度的一半 以后用span都需要减掉 
!hasSVG 
span.style.left = parseInt(span.style.left) - span.offsetWidth/2+'px'; 
}); 
//--------------------------------画纵向的点和文字----------------------------------------------------------------------- 
for(i=0;i<=lineNum;i++){ 
self.baseDraw('path',{ 
border : 1, 
borderColor : '#C0C0C0', 
isfill : false, 
path : [M, startX, processPoint(startY - (i * yPices)), L, processPoint(startX + drawAreaWidth), processPoint(startY - (i *yPices))] 
}) 
.css({zIndex:-10}) 
.appendTo(self.panel); 
var span = self.baseDraw('span',{ 
x : startX - 15, 
y : startY - i * yPices-calTextLen(min+i*f+'').h/2, 
'text-anchor':'middle' 
}) 
.css({ 
'font-family':'Verdana,Arial,Helvetica,sans-serif', 
'font-size':'12px', 
width: '40px', 
display:'block', 
textAlign:'right' 
}) 
.addText((min*1000+(i*1000*f/1000)*1000)/1000+'') 
.appendTo(self.panel) 
.element; 
if(!hasSVG){ 
span.style.top = parseInt(span.style.top) + span.offsetHeight/2 -5+'px'; 
span.style.left = parseInt(span.style.left) -35+'px' 
} 
} 
}else{ 
//横坐标单位间隔 
var yPices = drawAreaHeight / (opts.xUnit.units.length), 
//单位间隔的中心点 
offset = Math.round(yPices / 2); 

var x = hasSVG?25:70, 
vv = hasSVG?0:5; 
each(opts.xUnit.units,function(i,d){ 
self.baseDraw('path',{ 
border : 1, 
borderColor : '#C0C0C0', 
isfill : false, 
path : [ 
M, 
processPoint(startX-5), 
processPoint(startY-i * yPices), 
L, 
processPoint(startX), 
processPoint(startY-i * yPices), 
] 
}) 
.appendTo(self.panel); 
var span = self.baseDraw('span',{ 
x : startX - x, 
y : startY -i * yPices-offset-calTextLen(d).h/2+vv, 
'text-anchor':'middle' 
}) 
.css({ 
fontFamily:'Verdana,Arial,Helvetica,sans-serif', 
fontSize:'12px', 
width : '60px', 
textAlign:'right' 
}) 
.addText(d) 
.appendTo(self.panel) 
}); 

var xPices = drawAreaWidth / lineNum; 
for(var i=0;i<=lineNum;i++){ 
self.baseDraw('path',{ 
border : 1, 
borderColor : '#C0C0C0', 
isfill : false, 
path : [ 
M, 
processPoint(startX + (i * xPices)), 
processPoint(startY), 
L, 
processPoint(startX + (i*xPices)), 
processPoint(startY - drawAreaHeight) 
] 
}). 
appendTo(self.panel); 
var span = self.baseDraw('span',{ 
x : startX - calTextLen(min+i*f+'').w/2 + i * xPices, 
y : startY, 
'text-anchor':'left' 
}) 
.css({ 
fontFamily:'Verdana,Arial,Helvetica,sans-serif', 
fontSize:'12px' 
}) 
.addText(min+i*f+'') 
.appendTo(self.panel) 
.element; 
} 
} 
//----------------------------------------------------------------------------------------------------- 
//在画区域图的时候还需要起点的位置啊 
//因为坐标很可能是负数 而且也能不是从0开始的 所以+上jianju 
var jianju =0 
if(min>0)jianju = min; 
if(max<0)jianju = max; 
//计算开始的位置 
startX = opts.charts.panel==='x' ? startX :startX-xPices*(min/f); 
startY = opts.charts.panel==='x' ? startY+yPices*(min/f) : startY; 
opts.draw = { 
startX : startX, // X 轴起点 
startY : startY , // Y 轴起点 
xPices : xPices, // X 轴每份的宽度 
yPices : yPices, // Y 轴每份的宽度 
offset : offset, // X 单分中心点位置偏移量 
jianju : jianju*yPices/f, 
feed : f // Y 轴的每份有多少 
}; 
return this; 
}, 
createTooltip : function(){ 
//一个组 
this.tipC = this.group('tip') 
.css({zIndex: 200,height:'20px',width:'20px',position:'absolute'}) 
.appendTo() 
.hide() 
//画一个框框baseDraw 
this.tipBox = this.baseDraw('rect',{arc:0.22,fill:'#fff',border:2,borderColor:'#606060'}) 
.appendTo(this.tipC) 
//因为svg里面的g可以直接定位 但是vml里面的group渲染很慢 所以改div 所以这里的父不一洋 
var p = isIE ?this.tipBox :this.tipC; 
this.tipTxtContainer = this.baseDraw('text',{fill:'#000000',x:5,y:19,'text-anchor':'left'}) 
.css({ 
fontFamily:'Verdana,Arial,Helvetica,sans-serif', 
fontSize:'12px', 
background: '#FFF' 
}) 
.appendTo(p); 
this.tipText = doc.createTextNode(''); 
this.tipTxtContainer[0].appendChild(this.tipText); 
return this; 
}, 
showTooltip : function(obj, x, y,data){ 
var txt =obj.name + ((' : ' + data)||''), 
size = calTextLen(txt,this.tipTxtContainer[0].style.cssText), 
pos = {x : x - (size.w + 5 * 2)/2 ,y : y - 32}; 
this.tipC 
.toFront() 
.show(); 
if(hasSVG){ 
this.tipC.attr({transform:'translate('+pos.x+','+pos.y+')'}); 
this.tipBox 
.attr({width : size.w + 5 * 2,height : size.h + 5 * 2,stroke : obj.color||'#606060'}); 
}else{ 
this.tipC.css({left:pos.x,top:pos.y}); 
this.tipBox 
.css({width:size.w + 5 * 2,height : size.h + 5 * 2}) 
this.tipBox[0].strokeColor = obj.color||'#606060'; 
} 
this.tipText.nodeValue = txt || ''; 
}, 
hideTooltip: function(){ 
this.tipC.hide(); 
}, 
drawLegend : function(type,redraw){ 
var self = this, 
opts = this.opts, 
//颜色块的大小 
t_width = 20, 
t_height = 20, 
//块之间的距离 
t_space = 5, 
datas = opts.chartData, 
len = datas.length, 
css = opts.legend.style, 
//最大长度 如果是纵着的 需要最大的长度 
maxWidth = 10, 
maxHeight = 30, 
//这个东西的位置 
orig_pos = opts.legend.pos?opts.legend.pos:[2,2], 
//显示隐藏组的函数 
handle = function(i){ 
var g = self.mainGroup['chart'+i]; 
if(g.show){ 
g.chart.hide(); 
g.show = false; 
hasSVG 
? this.attr({fill:'#ccc'}) 
: this[0].style.color = '#ccc' 
}else{ 
g.chart.show(); 
g.show = true; 
hasSVG 
? this.attr({fill:'#000'}) 
: this[0].style.color = '#000' 
} 
}, 
arr = []; 
type = type ||'lateral'; 
var legendPanel = self.group('Legend') 
.appendTo(); 
if(type==='lateral'){ 
//如果是横着的 
var top = orig_pos[1] + 5, 
th = hasSVG?0:3, 
left = orig_pos[0] + 5; 
each(datas, function(i,d){ 
left = i===0 ? left : t_space+left; 
//计算所有left的位置 
self.baseDraw('rect',{ 
arc : 0.1, 
fill : d.color, 
border : 1, 
borderColor : d.color, 
left : left, 
top : top, 
width : t_width+'px', 
height : t_height+'px' 
}) 
.appendTo(legendPanel); 
left = left + t_width+2 + t_space; 
var w = calTextLen(d.name,css).w 
self.baseDraw('span',{ 
'text-anchor':'left', 
x : left, 
y : top+th 
}) 
.css(extend(css,{cursor:'pointer'})) 
.on('click',function(){ 
if(opts.charts.type==='pies')return; 
handle.call(this,i); 
}) 
.addText(d.name) 
.appendTo(legendPanel); 
left = left + w; 
}); 
this.baseDraw('rect',{ 
arc : 0.1, 
fill : 'none', 
border : 1.5, 
borderColor : '#666666', 
width : left+ t_space- orig_pos[0], 
height : maxHeight, 
left : orig_pos[0], 
top : orig_pos[1] 
}) 
.appendTo(legendPanel); 
}else{ 
var top = orig_pos[1] + 5, 
th = hasSVG?0:3, 
left = orig_pos[0] + 5; 
each(datas, function(i,d){ 
top = i===0 ? top : t_space + top; 
self.baseDraw('rect',{ 
arc : 0.1, 
fill : d.color, 
border : 1, 
borderColor : d.color, 
left : left, 
top : top, 
width : t_width+'px', 
height : t_height+'px' 
}) 
.appendTo(legendPanel); 
var h = calTextLen(d.name,css).h; 
self.baseDraw('span',{ 
'text-anchor':'left', 
x : left+t_width+2+t_space, 
y : top+th 
}) 
.css(extend(css,{cursor:'pointer'})) 
.addText(d.name) 
.on('click',function(){ 
if(opts.charts.type==='pies')return; 
handle.call(this,i); 
}) 
.appendTo(legendPanel); 
top = top + h+ t_space; 
maxWidth = Math.max(maxWidth,calTextLen(d.name,css).w); 
}); 
this.baseDraw('rect',{ 
arc : 0.1, 
fill : 'none', 
border : 1.5, 
borderColor : '#666666', 
width : maxWidth+22+15, 
height : top+t_space-orig_pos[1], 
left : orig_pos[0], 
top : orig_pos[1] 
}) 
.appendTo(legendPanel); 
} 
return this; 
}, 
drawLine : function(){ 
var self = this, 
opts = this.opts; 
draw = opts.draw; 
each(opts.chartData,function(i,o){ 
var id = 'chart'+i, 
lineGroup = self.group(id) 
.appendTo(); 
self.mainGroup[id]={chart:lineGroup,show:true}; 
var path = [M], 
data = o.data, 
line; 
for(var i = 0; i < data.length; i++){ 
if( data[i] == null){ 
//如果这个数据不存在 并且不是第一个数据 路径上加 M 
if(path[path.length - 1] !== M) 
path.push(M); 
}else{ 
//如果不是第一个数据 路径添加L 
i !== 0 && path.push("L"); 
//如果前面一个是null 并且不是第一个 把那个L去掉 
if(i > 0 && data[i - 1] == null) 
path.pop(); 
//计算出 点的x,y的位置 
var x = draw.startX + draw.offset + (i * draw.xPices), 
y = draw.startY - (data[i] * (draw.yPices / draw.feed)); 
if(isIE){ 
x = parseInt(x); 
y = parseInt(y); 
} 
path.push(x); 
path.push(y); 
//画点 
self.baseDraw('circle',{ 
x : x, 
y : y, 
r : 4, 
fillColor : o.color 
}) 
.attr({data:data[i]}) 
.css({zIndex:10,cursor:'pointer'}) 
.on('mouseover',(function(o,x,y){ 
return function(){ 
hasSVG 
? (this[0].setAttribute('r','5'),line.attr({'stroke-width':2.5})) 
: (this[0].strokeWeight = 3,line[0].strokeWeight = 2.5); 
self.showTooltip(o,x,y,this.attr('data')); 
} 
})(o,x,y)) 
.on('mouseout',function(){ 
hasSVG 
? (this[0].setAttribute('r','4'),line.attr({'stroke-width':1.5})) 
: (this[0].strokeWeight = 1,line[0].strokeWeight = 1.5); 
self.hideTooltip() 
}) 
.on('click',function(){lineGroup.toFront(); }) 
.appendTo(lineGroup); 
} 
}; 
//画折线 
line = self.baseDraw('path',{ 
border : 1.5, 
borderColor : o.color, 
isfill : false, 
path : path 
}) 
.css({zIndex:5}) 
.on('mouseover',function(){ 
hasSVG 
? this.attr({'stroke-width':2.5}) 
: (this[0].strokeWeight = 2.5); 
}) 
.on('mouseout',function(){ 
hasSVG 
? this.attr({'stroke-width':1.5}) 
: (this[0].strokeWeight = 1.5); 
}) 
.on('click',function(){lineGroup.toFront(); }) 
.appendTo(lineGroup); 
}); 
return this; 
}, 
drawArea : function(){ 
var self = this, 
opts = this.opts, 
draw = opts.draw; 
each(opts.chartData,function(i,o){ 
var id = 'chart' + i, 
areaGroup = self.group(id).appendTo(); 
self.mainGroup[id] = {chart : areaGroup,show : true}; 
//有2个路径 一个是区域的路径 一个是线的路径 
var areaPath = [M, (draw.startX + draw.offset).toFixed(0), (draw.startY-draw.jianju).toFixed(0)], 
path = [M], 
data = o.data, 
line; 
for(var n=0,l=data.length;n<l;n++){ 
//如果数据是空的 
var len = areaPath.length; 
if( data[n] === null){ 
//如果前面的一个不是m 就重新画 所以加上 M 
if(path[path.length - 1] !== M) 
path.push(M); 
//如果第1个 或者前面的都为bull 修改起点坐标 
len===3 
&&(areaPath[1] = (draw.startX +(n+1)*draw.xPices + draw.offset).toFixed(0)); 
//如果前面一个不是结束标识符 区域图结束 如果第一个数据是null 则不进行下面的操作 
if(areaPath[len - 1] !== seal&&n!==0){ 
areaPath=areaPath.concat([ 
areaPath[len - 2], 
(draw.startY-draw.jianju).toFixed(0), 
seal 
]); 
} 
}else{ 
n !== 0 && path.push(L); 
areaPath.push(L); 
//如果前面的那个数据是null 把之前的那个L去掉 
if(n > 0 && data[n - 1] == null){ 
path.pop(); 
//如果是第一个为null 不删除L 
n!==1&&areaPath.pop(); 
} 
var x = draw.startX + draw.offset + (n * draw.xPices), 
y = draw.startY - ((data[n]) * (draw.yPices / draw.feed)); 
if(isIE){ 
x = parseInt(x); 
y = parseInt(y); 
} 
path.push(x); 
path.push(y); 

if(areaPath[len - 1] === seal){ 
areaPath = areaPath.concat([ 
M, 
x, 
parseInt(draw.startY-draw.jianju), 
L, 
x, 
y 
]); 
}else{ 
areaPath.push(x); 
areaPath.push(y); 
} 
//如果是最后一个点 
if(n === l - 1){ 
areaPath.push(x); 
areaPath.push(parseInt(draw.startY-draw.jianju)); 
} 
//画点 
self.baseDraw('circle',{ 
x : x, 
y : y, 
r : 4, 
fillColor : o.color 
}) 
.attr({data:data[n]}) 
.on('mouseover',(function(o,x,y){ 
return function(){ 
hasSVG 
? (this[0].setAttribute('r','5'),line.attr({'stroke-width':2.5})) 
: (this[0].strokeWeight = 3,line[0].strokeWeight = 2.5); 
self.showTooltip(o,x,y,this.attr('data')); 
} 
})(o,x,y)) 
.on('mouseout',function(){ 
hasSVG 
? (this[0].setAttribute('r','4'),line.attr({'stroke-width':1.5})) 
: (this[0].strokeWeight = 1,line[0].strokeWeight = 1.5); 
self.hideTooltip() 
}) 
.on('click',function(){areaGroup.toFront(); }) 
.css({zIndex:10,cursor:'pointer'}) 
.appendTo(areaGroup); 
} 
} 
areaPath.push(seal) 
self.baseDraw('path',{ 
border : 0, 
isfill : true, 
fillColor : o.color, 
opacity : 0.5, 
path : areaPath 
}) 
.css({zIndex:5}) 
.appendTo(areaGroup); 
line = self.baseDraw('path',{ 
border : 2.5, 
borderColor : o.color, 
isfill : false, 
path : path 
}) 
.on('mouseover',function(){ 
hasSVG 
? this.attr({'stroke-width':2.5}) 
: (this[0].strokeWeight = 2.5); 
}) 
.on('mouseout',function(){ 
hasSVG 
? this.attr({'stroke-width':1.5}) 
: (this[0].strokeWeight = 1.5); 
}) 
.on('click',function(){areaGroup.toFront(); }) 
.css({zIndex:-1}) 
.appendTo(areaGroup); 
}); 
return this; 
}, 
drawColumns : function(){ 
var self = this, 
opts = this.opts, 
draw = opts.draw, 
chartData = opts.chartData, 
dataLen = chartData.length, 
//多个柱子之间的间距 
columnSpace = 3, 
//一个位置中 所有的间隔之和 
columnPadding = columnSpace * dataLen + columnSpace, 
//每个柱子的宽度 
columnSize = self.opts.charts.panel==='x' 
? Number(((draw.xPices - columnPadding) / dataLen).toFixed(0)) 
: Number(((draw.yPices - columnPadding) / dataLen).toFixed(0)); 
each(chartData, function(i,o){ 
var data = o.data, 
id = 'chart' + i, 
isX = opts.charts.panel==='x', 
colGroup = self.group(id).appendTo(), 
//每个点开始的位置 
start = self.opts.charts.panel==='x' 
? draw.startX + columnSpace + i*(columnSize+columnSpace) 
: draw.startY + columnSpace + i*(columnSize+columnSpace) 
self.mainGroup[id] = {chart:colGroup,show:true}; 
for(var j = 0,l=data.length; j < l ; j++){ 
if(data[j]===null) continue; 
//如果是横盘子 
if(isX){ 
var x = Number((start + j *draw.xPices ).toFixed(0)), 
y = Number((draw.startY).toFixed(0)), 
height = Number((data[j] * (draw.yPices / draw.feed)).toFixed(0)), 
path = [ 
M, 
x, 
y, 
L, 
x, 
y -height, 
L, 
x + columnSize, 
y - height, 
L, 
x + columnSize, 
y, 
seal 
]; 
var pos = [x+columnSize/2,data[j]>0?y-height:draw.startY]; 
}else{ 
var x = Number((draw.startX).toFixed(0)), 
width = Number((data[j]*((draw.xPices / draw.feed))).toFixed(0)), 
y = Number((start - (j+1) *draw.yPices ).toFixed(0)), 
path = [ 
M, 
x, 
y, 
L, 
x+ width, 
y , 
L, 
x + width, 
y + columnSize, 
L, 
x , 
y+ columnSize, 
seal 
]; 
var pos = [draw.startX+width/2,y-columnSize]; 
} 
self.baseDraw('path',{ 
border : 0, 
isfill : true, 
fillColor : o.color, 
opacity : 1, 
path : path 
}) 
.attr({data:data[j]}) 
.css({zIndex:5,cursor:'pointer'}) 
.on('mouseover',(function(x,y,d){ 
return function(){ 
this.setOpacity(0.85); 
self.showTooltip(o,x,y,this.attr('data')); 
} 
})(pos[0],pos[1],data[j]) 
) 
.on('mouseout',(function(x,y){ 
return function(){ 
this.setOpacity(1); 
self.hideTooltip(); 
} 
})(x,y)) 
.appendTo(colGroup); 
} 
}); 
return this; 
}, 
drawPie : function(){ 
var self = this, 
opts = this.opts, 
area = opts.area, 
rx = area.centerX, 
ry = area.centerY, 
inc = 0, 
total = 0, 
data = [], 
cumulative = -0.25, // start at top; 
circ = 2 * Math.PI, 
radiu = mathMin(opts.charts.radius,mathMin(area.areaWidth/2,area.areaHeight/2)), 
fraction, 
half_fraction; 
each(opts.chartData,function(i,o){ 
typeof o.data ==='object' 
? (data.push((function(o){ 
var all =0; 
for(var i in o) 
all+=~~o[i] 
return all 
})(o.data))) 
:data.push(mathAbs(o.data)) 
}); 
each(data,function(i,o){ 
total = total + o; 
}); 
each(data,function(i,o){ 
var pieGroup = self.group('chart'+i).appendTo(), 
s = inc/total*360, 
e = (inc + o)/total*360, 
name = opts.chartData[i].name, 
size = calTextLen(name), 
dot = angle(radiu,[rx,ry],s+(e-s)/2,2), 
x = rx + (dot[0]-rx)/2 - size.w/2, 
y = ry + (dot[1]-ry)/2 - size.h/2, 
len = Math.sqrt((x-rx)*(x-rx)+(y-ry)*(y-ry)), 
moveDisplacement = ((x-rx)*8/len)+','+((y-ry)*8/len); 
inc = inc + o; 
var value = Number(o); 
fraction = total ? value / total : 0; 
half_fraction = total ? (value / 2) / total : 0; 
var start = cumulative * circ; 
half_cumulative = cumulative + half_fraction; 
cumulative += fraction; 
var end = cumulative * circ; 
self.baseDraw('pie',{ 
config : opts.chartData[i], 
s : start, 
e : end, 
r : radiu, 
innerR : 0 
}) 
.css({zIndex:5,cursor:'pointer'}) 
.attr({move:moveDisplacement}) 
.on('mouseover',function(){ 
this.setOpacity(0.85); 
}) 
.on('mouseout',function(){ 
this.setOpacity(1); 
}) 
.on('click',function(){ 
var m = this.attr('move') 
if(m.indexOf('+')>0){ 
hasSVG 
? this.attr({ 
transform: 'translate(0,0)' 
}) 
: this.css({ 
left : '0px', 
top : '0px' 
}) 
this.attr({move:m.replace('+','')}); 
}else{ 
var s= m.split(','); 
hasSVG 
? this.attr({ 
transform: 'translate('+m+')' 
}) 
: this.css({ 
left : s[0]+'px', 
top : s[1]+'px' 
}) 
this.attr({move:m+'+'}); 
} 
}) 
.appendTo(pieGroup); 
self.mainGroup['chart'+i] = {chart:pieGroup,show:true}; 
self.baseDraw('span',{ 
x : x, 
y : y, 
fill : '#fff', 
'text-anchor':'left' 
}) 
.css({ 
fontFamily : 'Verdana,Arial,Helvetica,sans-serif', 
fontSize : '12px', 
position : 'absolute', 
color : '#fff', 
zIndex : 10 
}) 
.addText(name) 
.appendTo(pieGroup); 
}); 
}, 
drawPies : function(){ 
var self = this, 
opts = this.opts, 
area = opts.area, 
rx = area.centerX, 
ry = area.centerY, 
total = 0, 
data = [], 
chartData = opts.chartData, 
cumulative = -0.25, // start at top; 
circ = 2 * Math.PI, 
radiu = mathMin(opts.charts.radius,mathMin(area.areaWidth/2,area.areaHeight/2)), 
fraction, 
half_cumulative, 
half_fraction; 
each(chartData,function(i,o){ 
each(o.data,function(j,d){ 
data[j] 
? data[j] +=mathAbs(d) 
: data[j] =mathAbs(d) 
}); 
}); 
//看有多少个数据来生成来生成内半径 
var len = data.length, 
innerSpace = radiu / 10; 
Rpice = (radiu - innerSpace) / len, 
piesGroup = this.group('pies').appendTo(); 
each(data,function(i,d){ 
var inc = 0 ; 
if(d===0) return; 
each(chartData,function(j,o){ 
if(~~o.data[i]===0)return; 
var outR = radiu - Rpice * i, 
innerR = radiu - Rpice * (i + 1), 
value = ~~o.data[i], 
fraction = value / d; 
half_fraction = (value/2)/d , 
start = cumulative * circ, 
s = inc/d*360, 
e = (inc + value)/d*360; 
inc = inc + value; 
var name = o.name, 
size = calTextLen(name), 
dot = angle(radiu,[rx,ry],s+(e-s)/2,2), 
px = dot[0]>rx?1:-1, 
py = dot[1]>ry?1:-1; 
var x = rx + px*innerSpace + ((dot[0]-rx-px*innerSpace)/len)*(len-i-1)+((dot[0]-rx-px*innerSpace)/len)/2- size.w/2, 
y = ry + py*innerSpace +((dot[1]-ry-py*innerSpace)/len)*(len-i-1)+((dot[1]-ry-py*innerSpace)/len)/2- size.h/2; 
half_cumulative = cumulative + half_fraction, 
cumulative += fraction, 
end = cumulative * circ; 
self.baseDraw('pie',{ 
config : o, 
s : start, 
e : end, 
r : outR, 
innerR : innerR 
}) 
.css({zIndex:5,cursor:'pointer'}) 
.on('mouseover',function(){ 
this.setOpacity(0.85); 
}) 
.on('mouseout',function(){ 
this.setOpacity(1); 
}) 
.appendTo(piesGroup); 
self.baseDraw('span',{ 
x : x, 
y : y, 
fill : '#fff', 
'text-anchor':'left' 
}) 
.css({ 
fontFamily : 'Verdana,Arial,Helvetica,sans-serif', 
fontSize : '12px', 
position : 'absolute', 
color : '#fff', 
zIndex : 10 
}) 
.addText(name) 
.appendTo(piesGroup); 
}) 
}); 
}, 
drawSegment : function(){ 
var self = this, 
opts = this.opts, 
draw = opts.draw, 
chartData = opts.chartData, 
columnPad = 5, 
columnWidth = draw.xPices - columnPad * 2; 
each(chartData,function(i,c){ 

}); 
}, 
baseDraw : function(type,config){ 
var self = this 
arg = arguments; 
return { 
rect : function(){ 
var set = {}; 
set.rx = set.ry = config.arc*30 || 5; 
set.width = config.width || 50; 
set.height = config.height || 50; 
set.fill = config.fill || '#fff'; 
set['fill-opacity'] = config.opacity || 0.85; 
set['stroke-width'] = config.border || 2; 
set.stroke = config.borderColor || '#606060'; 
set.transform = 'translate('+(config.left||0)+','+(config.top||0)+')'; 
return self.createElement('rect') 
.attr(set) 
}, 
text : function(){ 
return self.createElement('text') 
.attr(config) 
}, 
span : function(){ 
var elem= self.createElement('text') 
.attr(config) 
.attr({ 
y : config.y+(arg[2]||15) 
}) 
return elem; 
}, 
path : function(){ 
var set = {}; 
set['stroke-width'] = config.border; 
set.stroke = config.borderColor || '#C0C0C0'; 
set.fill = config.isfill?config.fillColor:'none'; 
set.d = config.path; 
config.opacity 
&&(set['fill-opacity'] = config.opacity); 
return self.createElement('path') 
.attr(set); 
}, 
circle : function(){ 
var set = {}; 
set.cx = config.x; 
set.cy = config.y; 
set.r = config.r; 
set.fill = config.fillColor; 
return self.createElement('circle') 
.attr(set); 
}, 
pie : function(){ 
//config,s,e,r,index 
var opts = self.opts, 
s = config.s, 
r = config.r, 
e = config.e - 0.000001, 
id = 'chart'+config.index, 
area = opts.area, 
rx = area.centerX, 
ry = area.centerY, 
cosStart = mathCos(s), 
sinStart = mathSin(s), 
cosEnd = mathCos(e), 
sinEnd = mathSin(e), 
color = config.config.color, 
innerR = config.innerR, 
longArc = e - s < Math.PI ? 0 : 1, 
path = [ 
M, 
rx + r * cosStart, 
ry + r * sinStart, 
'A', 
r, 
r, 
0, 
longArc, 
1, 
rx + r * cosEnd, 
ry + r * sinEnd, 
L, 
rx + innerR * cosEnd, 
ry + innerR * sinEnd, 
'A', // arcTo 
innerR, // x radius 
innerR, // y radius 
0, // slanting 
longArc, // long or short arc 
0, // clockwise 
rx + innerR * cosStart, 
ry + innerR * sinStart, 
'Z' 
]; 
return self.baseDraw('path',{ 
border : 1, 
border : '#fff', 
isfill : true, 
fillColor : color, 
opacity : 1, 
path : path 
}) 
} 
}[type](); 
} 
}; 
//--------------------------------------------------------------------------------------------------- 
//如果是vml 修改smipleChart.prototype中的一些方法 
!hasSVG 
&&extend(smipleChart.prototype,{ 
baseDraw : function(type,config){ 
var self = this, 
width = this.width, 
height = this.height, 
name = arguments[2]; 
return { 
rect : function(){ 
var attr = {}, 
css = {}; 
attr.arcsize = config.arc || 0.2 +''; 
if(config.fill==='none'){ 
attr.filled = 'f' 
}else{ 
attr.filled = 't'; 
attr.fillcolor = config.fill || '#fff'; 
} 
attr.strokeWeight = config.border || 2; 
attr.strokeColor = config.borderColor || '#606060'; 
css.width = config.width || 50 +'px'; 
css.height = config.height || 50 +'px'; 
css.zIndex = 10; 
css.left = config.left||0+'px'; 
css.top = config.top ||0+'px'; 
return self.createElement('roundrect') 
.attr(attr) 
.css(css) 
}, 
text : function(){ 
return self.createElement('TextBox') 
.attr({inset : "2px,2px,2px,2px" }) 
}, 
span : function(){ 
return self.createElement('span'). 
css({ 
position:'absolute', 
left : config.x+'px', 
top : config.y+'px' 
}) 
}, 
path : function(){ 
var attr = {}, 
css = { 
width : width+'px', 
height : height+'px' 
}; 
if(config.border===0){ 
attr.Stroked = 'f'; 
attr.strokeWeight =0; 
}else{ 
attr.strokeWeight = config.border||1 ; 
} 
attr.strokeColor = config.borderColor || "#C0C0C0"; 
attr.filled = config.isfill?'t':'f'; 
attr.filled==='t' 
&&(attr.fillcolor=config.fillColor||"#C0C0C0"); 
attr.coordsize = width+','+height; 
attr.path = config.path; 
var elem = self.createElement() 
.attr(attr) 
.css(css); 
if(config.opacity){ 
var fill = self.createElement('fill') 
.attr({ 
type : 'fill', 
color : config.fillColor||"#C0C0C0", 
opacity : config.opacity 
}) 
.appendTo(elem); 
//那这个对象的一个属性引用设置透明的元素 以后会用到 
elem.opacity = fill[0]; 
} 
return elem; 
}, 
circle : function(){ 
var attr ={ 
strokeWeight : 1, 
coordsize : width+','+height, 
filled : 't' 
}, 
css ={ 
width : width+'px', 
height : height+'px' 
} 
x = config.x, 
y = config.y, 
r = config.r; 
attr.strokeColor=attr.fillcolor = config.fillColor 
attr.path =[ 
'wa', // clockwisearcto 
x - r, // left 
y - r, // top 
x + r, // right 
y + r, // bottom 
x + r, // start x 
y, // start y 
x + r, // end x 
y, // end y 
'e' // close 
]; 
return self.createElement() 
.attr(attr) 
.css(css) 
}, 
pie : function(){ 
////config,s,e,r,index 
var opts = self.opts, 
area = opts.area, 
r = config.r, 
rx = area.centerX, 
ry = area.centerY, 
innerR= config.innerR||0, 
sDot = angle(r,[rx,ry],s,2), 
eDot = angle(r,[rx,ry],e,2), 
color = config.config.color, 
s = config.s, 
e = config.e, 
e = e - s == 2 * Math.PI ? e - 0.001 : e, 
cosStart = mathCos(s), 
sinStart = mathSin(s), 
cosEnd = mathCos(e), 
sinEnd = mathSin(e), 

path = [ 
'wa', // clockwisearcto 
(rx - r).toFixed(0), // left 
(ry - r).toFixed(0), // top 
(rx + r).toFixed(0), // right 
(ry + r).toFixed(0), // bottom 
(rx + r * cosStart).toFixed(0), // start x 
(ry + r * sinStart).toFixed(0), // start y 
(rx + r * cosEnd).toFixed(0), // end x 
(ry + r * sinEnd).toFixed(0), // end y 
'at', // clockwisearcto 
(rx - innerR).toFixed(0), // left 
(ry - innerR).toFixed(0), // top 
(rx + innerR).toFixed(0), // right 
(ry + innerR).toFixed(0), // bottom 
(rx + innerR * cosEnd).toFixed(0), // start x 
(ry + innerR * sinEnd).toFixed(0), // start y 
(rx + innerR * cosStart).toFixed(0), // end x 
(ry + innerR * sinStart).toFixed(0), // end y 
'x', // finish path 
'e' // close 
]; 
return self.baseDraw('path',{ 
border : 1, 
border : '#fff', 
isfill : true, 
fillColor : color, 
opacity : 1, 
path : path 
}) 
} 
}[type](); 
} 
}); 
//--------------------------------------------------------------------------------------------------- 
})(document); 
window.onload = function(){ 
var config = { 
charts : { 
type : 'line', 
radius : 150, 
panel : 'x', 
style: { 
fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif', // default font 
fontSize: '12px' 
} 
}, 
title : { 
text : '线性图标' , 
y : 10, 
style : { 
color: 'black', 
fontSize: '16px' 
} 
}, 
subTitle : { 
text : '线性图标副标题', 
y : 35, 
style: { 
color: '#111', 
fontSize: '12px' 
} 
}, 
legend : { 
enable : true, 
//type : 'lateral', // lateral 横向 或 lengthwise 纵向 
type : 'lateral', 
pos : [10,10], 
style:{ 
fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif', // default font 
fontSize: '12px', 
magin:'0px' 
} 
}, 
yUnit : { 
text : '线性图标侧标题', 
x : 20, 
style: { 
color : '#111', 
fontSize : '12px' 
} 
}, 
xUnit : { 
units: [ 
'一月', 
'二月', 
'三月', 
'四月', 
'五月', 
'六月', 
'七月', 
'八月', 
'九月', 
'十月', 
'十一月', 
'十二月' 
] 
}, 
chartData : [ 
{ 
name : 'xcv', 
color : '#4572A7', 
data : [-18,45,-38,29,95,-45,77] 
}, { 
name: 'frfr', 
color: '#AA4643', 
data: [-44,12,78,-100,13,4,-56,-34] 
}, { 
name: 'AAAAA', 
color: '#89A54E', 
data: [null,78,83,null,22,-78,2,44,78] 
}, { 
name: 'BBBB', 
color: '#80699B', 
data: [null, 58, 35, null, 52, 47, 26, -55, 39, 123,15,66] 
} 
] 
}; 
new smipleChart($('line'),config); 
config.charts.type ='area'; 
config.title.text ='区域图标' 
config.subTitle.text='区域图标副标题' 
config.yUnit.text ='区域图标侧标题' 
new smipleChart($('area'),config); 
config.title.text ='柱状图标' 
config.subTitle.text='柱状图标副标题' 
config.yUnit.text ='柱状图标侧标题' 
config.charts.type ='columns'; 
config.chartData =[ 
{ 
name : 'xcv', 
color : '#4572A7', 
data : [-0.01,-0.62,0,0.55,null,0.78,-0.63,-0.82,null,null,0.33] 
}, { 
name: 'frfr', 
color: '#AA4643', 
data: [-0.22,0.82,0.55,1.32,0.33,0.95,null,1,0.65,null,0.78] 
}, { 
name: 'AAAAA', 
color: '#89A54E', 
data: [null,0.62,0.34,null,0.63,0,-0.23,-1,0.62,0.45,null,-0.56] 
} 
] 
new smipleChart($('zhu'),config); 
config.charts.panel='y' 
new smipleChart($('zhu1'),config); 
config.charts.type ='pie'; 
config.title.text ='饼图图标' 
config.subTitle.text='饼图图标副标题' 
config.yUnit.text ='' 
config.legend.type='lengthwise'; 
config.chartData =[ 
{ 
name : 'aaa', 
color : '#4572A7', 
data : [433,123,null,66] 
}, { 
name: 'bbb', 
color: '#AA4643', 
data: [45,33,33,511] 
}, { 
name: 'ccc', 
color: '#89A54E', 
data: [55,null,75,333] 
} 
] 
config.legend.pos= [680,30] 
new smipleChart($('pie'),config); 
config.charts.type ='pies'; 
config.title.text ='多层饼图图标' 
config.subTitle.text='多层饼图图标副标题' 
config.legend.type='lateral'; 
config.legend.pos= [330,400] 
new smipleChart($('pies'),config); 

config.chartData =[ 
{ 
name : 'xcv', 
color : '#4572A7', 
data : [433,355,275,null,588,323,576,32,99] 
}, { 
name: 'frfr', 
color: '#AA4643', 
data: [45,666,100,null,677,56,88,633,55,64] 
}, { 
name: 'AAAAA', 
color: '#89A54E', 
data: [55,162,75,null,364,0,637,112,163,615] 
} 
] 
config.yUnit.lineNum = 2; 
config.title.text ='比较小的' 
config.subTitle.text='只设置了2条线' 
config.yUnit.text ='小测标题' ; 
config.charts.type ='line'; 
config.legend.pos= [10,10] 
new smipleChart($('vv'),config); 
config.yUnit.lineNum = 10; 
config.charts.panel = 'x'; 
config.charts.type ='segment'; 
//new smipleChart($('segment'),config); 
} 
</script> 
</body> 
</html>
Javascript 相关文章推荐
九种js弹出对话框的方法总结
Mar 12 Javascript
tangram框架响应式加载图片方法
Nov 21 Javascript
javascript判断数组内是否重复的方法
Apr 21 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
Aug 06 Javascript
用Vue.js实现监听属性的变化
Nov 17 Javascript
在Js页面通过POST传递参数跳转到新页面详解
Aug 25 Javascript
基于bootstrap写的一点localStorage本地储存
Nov 21 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
Sep 03 Javascript
d3绘制基本的柱形图的实现代码
Dec 12 Javascript
JS实现的对象去重功能示例
Jun 04 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
Apr 08 Javascript
详解Vue的异步更新实现原理
Dec 22 Vue.js
javascript Window及document对象详细整理
Jan 12 #Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
Jan 12 #Javascript
奉献给JavaScript初学者的编写开发的七个细节
Jan 11 #Javascript
从盛大通行证上摘下来的身份证验证js代码
Jan 11 #Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
Jan 11 #Javascript
javascript获取当前日期时间及其它操作函数
Jan 11 #Javascript
JavaScript中URL编码函数代码
Jan 11 #Javascript
You might like
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
PHP实现的折半查询算法示例
2017/10/09 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
JS碰撞运动实现方法详解
2016/12/15 Javascript
详解js中==与===的区别
2017/01/08 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
vue中组件通信的八种方式(值得收藏!)
2019/08/09 Javascript
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
python备份文件的脚本
2008/08/11 Python
Python Web开发模板引擎优缺点总结
2014/05/06 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
Python实现对百度云的文件上传(实例讲解)
2017/10/21 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
python list转矩阵的实例讲解
2018/08/04 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
医院工作检讨书范文
2014/02/10 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
表彰会主持词
2014/03/26 职场文书
《穷人》教学反思
2016/02/19 职场文书
mysql创建存储过程及函数详解
2021/12/04 MySQL