32 lines
2.4 KiB
JavaScript
32 lines
2.4 KiB
JavaScript
(function($){var options={series:{stack:null}};function init(plot){function findMatchingSeries(s,allseries){var res=null;for(var i=0;i<allseries.length;++i){if(s==allseries[i])
|
|
break;if(allseries[i].stack==s.stack)
|
|
res=allseries[i];}
|
|
return res;}
|
|
function stackData(plot,s,datapoints){if(s.stack==null||s.stack===false)
|
|
return;var other=findMatchingSeries(s,plot.getData());if(!other)
|
|
return;var ps=datapoints.pointsize,points=datapoints.points,otherps=other.datapoints.pointsize,otherpoints=other.datapoints.points,newpoints=[],px,py,intery,qx,qy,bottom,withlines=s.lines.show,horizontal=s.bars.horizontal,withbottom=ps>2&&(horizontal?datapoints.format[2].x:datapoints.format[2].y),withsteps=withlines&&s.lines.steps,fromgap=true,keyOffset=horizontal?1:0,accumulateOffset=horizontal?0:1,i=0,j=0,l,m;while(true){if(i>=points.length)
|
|
break;l=newpoints.length;if(points[i]==null){for(m=0;m<ps;++m)
|
|
newpoints.push(points[i+ m]);i+=ps;}
|
|
else if(j>=otherpoints.length){if(!withlines){for(m=0;m<ps;++m)
|
|
newpoints.push(points[i+ m]);}
|
|
i+=ps;}
|
|
else if(otherpoints[j]==null){for(m=0;m<ps;++m)
|
|
newpoints.push(null);fromgap=true;j+=otherps;}
|
|
else{px=points[i+ keyOffset];py=points[i+ accumulateOffset];qx=otherpoints[j+ keyOffset];qy=otherpoints[j+ accumulateOffset];bottom=0;if(px==qx){for(m=0;m<ps;++m)
|
|
newpoints.push(points[i+ m]);newpoints[l+ accumulateOffset]+=qy;bottom=qy;i+=ps;j+=otherps;}
|
|
else if(px>qx){if(withlines&&i>0&&points[i- ps]!=null){intery=py+(points[i- ps+ accumulateOffset]- py)*(qx- px)/ (points[i - ps + keyOffset] - px);
|
|
newpoints.push(qx);newpoints.push(intery+ qy);for(m=2;m<ps;++m)
|
|
newpoints.push(points[i+ m]);bottom=qy;}
|
|
j+=otherps;}
|
|
else{if(fromgap&&withlines){i+=ps;continue;}
|
|
for(m=0;m<ps;++m)
|
|
newpoints.push(points[i+ m]);if(withlines&&j>0&&otherpoints[j- otherps]!=null)
|
|
bottom=qy+(otherpoints[j- otherps+ accumulateOffset]- qy)*(px- qx)/ (otherpoints[j - otherps + keyOffset] - qx);
|
|
newpoints[l+ accumulateOffset]+=bottom;i+=ps;}
|
|
fromgap=false;if(l!=newpoints.length&&withbottom)
|
|
newpoints[l+ 2]+=bottom;}
|
|
if(withsteps&&l!=newpoints.length&&l>0&&newpoints[l]!=null&&newpoints[l]!=newpoints[l- ps]&&newpoints[l+ 1]!=newpoints[l- ps+ 1]){for(m=0;m<ps;++m)
|
|
newpoints[l+ ps+ m]=newpoints[l+ m];newpoints[l+ 1]=newpoints[l- ps+ 1];}}
|
|
datapoints.points=newpoints;}
|
|
plot.hooks.processDatapoints.push(stackData);}
|
|
$.plot.plugins.push({init:init,options:options,name:'stack',version:'1.2'});})(jQuery); |