📄 chart.js
字号:
this.assignColors(); this._isInitialized=true; }, destroy:function(){ // summary // Node cleanup while(this.domNode.childNodes.length>0){ this.domNode.removeChild(this.domNode.childNodes[0]); } this.vectorNode=this.plotArea=this.dataGroup=this.axisGroup=null; }, render:function(){ // summary // Draws the data on the chart if (this.dataGroup){ while(this.dataGroup.childNodes.length>0){ this.dataGroup.removeChild(this.dataGroup.childNodes[0]); } } else { this.init(); } for(var i=0; i<this.series.length; i++){ dojo.widget.vml.Chart.Plotter.plot(this.series[i], this); } }, postCreate:function(){ // summary // Parse any data if included with the chart, and kick off the rendering. var table=this.domNode.getElementsByTagName("table")[0]; if (table){ var ranges=this.parseProperties(table); var bRangeX=false; var bRangeY=false; // fix the axes var axisValues = this.parseData(table); if(!bRangeX){ this.properties.axes.x.range={min:axisValues.x.min, max:axisValues.x.max}; } if(!bRangeY){ this.properties.axes.y.range={min:axisValues.y.min, max:axisValues.y.max}; } this.setAxesPlot(table); // table values should be populated, now pop it off. this.domNode.removeChild(table); } if(this.series.length>0){ this.render(); } }});dojo.widget.vml.Chart.Plotter=new function(){ // summary // Singleton for plotting series of data. var self=this; var plotters = {}; var types=dojo.widget.Chart.PlotTypes; this.getX=function(/* string||number */value, /* dojo.widget.Chart */chart){ // summary // Calculate the x coord on the passed chart for the passed value var v=parseFloat(value); var min=chart.properties.axes.x.range.min; var max=chart.properties.axes.x.range.max; var ofst=0-min; min+=ofst; max+=ofst; v+=ofst; var xmin = 0; var xmax=chart.properties.width-chart.properties.padding.left-chart.properties.padding.right; var x=(v*((xmax-xmin)/max))+xmin; return x; }; this.getY=function(/* string||number */value, /* dojo.widget.Chart */chart){ // summary // Calculate the y coord on the passed chart for the passed value var v=parseFloat(value); var max=chart.properties.axes.y.range.max; var min=chart.properties.axes.y.range.min; var ofst=0; if(min<0)ofst+=Math.abs(min); min+=ofst; max+=ofst; v+=ofst; var ymin=chart.properties.height-chart.properties.padding.top-chart.properties.padding.bottom; var ymax = 0; var y=(((ymin-ymax)/(max-min))*(max-v))+ymax; return y; }; this.addPlotter=function(/* string */name, /* function */func){ // summary // add a custom plotter function to this object. plotters[name]=func; }; this.plot=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){ // summary // plot the passed series. if (series.values.length==0) return; // void if (series.plotType && plotters[series.plotType]){ return plotters[series.plotType](series, chart); // void } else if (chart.plotType && plotters[chart.plotType]){ return plotters[chart.plotType](series, chart); // void } }; // plotting plotters["bar"]=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){ // summary // plot the passed series as a set of bars. var space=1; var lastW = 0; var ys = []; var yAxis=self.getY(chart.properties.axes.x.plotAt, chart); var yA = yAxis; for (var i=0; i<series.values.length; i++){ var x=self.getX(series.values[i].x, chart); var w; if (i==series.values.length-1){ w=lastW; } else{ w=self.getX(series.values[i+1].x, chart)-x-space; lastW=w; } x-=(w/2); var y=self.getY(series.values[i].value, chart); var h=Math.abs(yA-y); if (parseFloat(series.values[i].value) < chart.properties.axes.x.plotAt){ y=yA; } var bar=document.createElement("v:rect"); bar.style.position="absolute"; bar.style.top=y+"px"; bar.style.left=x+"px"; bar.style.width=w+"px"; bar.style.height=h+"px"; bar.setAttribute("fillColor", series.color); bar.setAttribute("stroked", "false"); bar.style.antialias="false"; bar.setAttribute("title", series.label + " (" + i + "): " + series.values[i].value); var fill=document.createElement("v:fill"); fill.setAttribute("opacity", "0.9"); bar.appendChild(fill); chart.dataGroup.appendChild(bar); } }; plotters["line"]=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){ // summary // plot the passed series as a line with tensioning var tension=1.5; var line=document.createElement("v:shape"); line.setAttribute("strokeweight", "2px"); line.setAttribute("strokecolor", series.color); line.setAttribute("fillcolor", "none"); line.setAttribute("filled", "false"); line.setAttribute("title", series.label); line.setAttribute("coordsize", chart.properties.width + "," + chart.properties.height); line.style.position="absolute"; line.style.top="0px"; line.style.left="0px"; line.style.width= chart.properties.width+"px"; line.style.height=chart.properties.height+"px"; var stroke=document.createElement("v:stroke"); stroke.setAttribute("opacity", "0.85"); line.appendChild(stroke); var path = []; for (var i=0; i<series.values.length; i++){ var x = Math.round(self.getX(series.values[i].x, chart)); var y = Math.round(self.getY(series.values[i].value, chart)); if (i==0){ path.push("m"); path.push(x+","+y); }else{ var lastx=Math.round(self.getX(series.values[i-1].x, chart)); var lasty=Math.round(self.getY(series.values[i-1].value, chart)); var dx=x-lastx; var dy=y-lasty; path.push("c"); var cx=Math.round((x-(tension-1)*(dx/tension))); path.push(cx+","+lasty); cx=Math.round((x-(dx/tension))); path.push(cx+","+y); path.push(x+","+y); } } line.setAttribute("path", path.join(" ")+" e"); chart.dataGroup.appendChild(line); }; plotters["area"]=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){ // summary // plot the passed series as an area with tensioning. var tension=1.5; var line=document.createElement("v:shape"); line.setAttribute("strokeweight", "1px"); line.setAttribute("strokecolor", series.color); line.setAttribute("fillcolor", series.color); line.setAttribute("title", series.label); line.setAttribute("coordsize", chart.properties.width + "," + chart.properties.height); line.style.position="absolute"; line.style.top="0px"; line.style.left="0px"; line.style.width= chart.properties.width+"px"; line.style.height=chart.properties.height+"px"; var stroke=document.createElement("v:stroke"); stroke.setAttribute("opacity", "0.8"); line.appendChild(stroke); var fill=document.createElement("v:fill"); fill.setAttribute("opacity", "0.4"); line.appendChild(fill); var path = []; for (var i=0; i<series.values.length; i++){ var x = Math.round(self.getX(series.values[i].x, chart)); var y = Math.round(self.getY(series.values[i].value, chart)); if (i==0){ path.push("m"); path.push(x+","+y); }else{ var lastx=Math.round(self.getX(series.values[i-1].x, chart)); var lasty=Math.round(self.getY(series.values[i-1].value, chart)); var dx=x-lastx; var dy=y-lasty; path.push("c"); var cx=Math.round((x-(tension-1)*(dx/tension))); path.push(cx+","+lasty); cx=Math.round((x-(dx/tension))); path.push(cx+","+y); path.push(x+","+y); } } path.push("l"); path.push(x + "," + self.getY(0, chart)); path.push("l"); path.push(self.getX(0, chart) + "," + self.getY(0,chart)); line.setAttribute("path", path.join(" ")+" x e"); chart.dataGroup.appendChild(line); }; plotters["scatter"]=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){ // summary // plot the passed series as a scatter chart var r=6; for (var i=0; i<series.values.length; i++){ var x=self.getX(series.values[i].x, chart); var y=self.getY(series.values[i].value, chart); var mod=r/2; var point=document.createElement("v:rect"); point.setAttribute("fillcolor", series.color); point.setAttribute("strokecolor", series.color); point.setAttribute("title", series.label + ": " + series.values[i].value); point.style.position="absolute"; point.style.rotation="45"; point.style.top=(y-mod)+"px"; point.style.left=(x-mod)+"px"; point.style.width=r+"px"; point.style.height=r+"px"; var fill=document.createElement("v:fill"); fill.setAttribute("opacity", "0.6"); point.appendChild(fill); chart.dataGroup.appendChild(point); } }; plotters["bubble"]=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){ // summary // plot the passed series as a series of bubbles (scatter with 3rd dimension) // added param for series[n].value: size var minR=1; // do this off the x axis? var min=chart.properties.axes.x.range.min; var max=chart.properties.axes.x.range.max; var ofst=0-min; min+=ofst; max+=ofst; var xmin=chart.properties.padding.left; var xmax=chart.properties.width-chart.properties.padding.right; var factor=(max-min)/(xmax-xmin)*25; for (var i=0; i<series.values.length; i++){ var size = series.values[i].size; if (isNaN(parseFloat(size))) size=minR; var radius=(parseFloat(size)*factor)/2; var diameter=radius * 2; var cx=self.getX(series.values[i].x, chart); var cy=self.getY(series.values[i].value, chart); var top=cy-radius; var left=cx-radius; var point=document.createElement("v:oval"); point.setAttribute("fillcolor", series.color); point.setAttribute("title", series.label + ": " + series.values[i].value + " (" + size + ")"); point.setAttribute("stroked", "false"); point.style.position="absolute"; point.style.top=top+"px"; point.style.left=left+"px"; point.style.width=diameter+"px"; point.style.height=diameter+"px"; var fill=document.createElement("v:fill"); fill.setAttribute("opacity", "0.8"); point.appendChild(fill); chart.dataGroup.appendChild(point); } };}();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -