dojo中有一個專門針對Web矢量圖開發的控件包--dojox.charting,這里面有不少功能完善的圖形控件。“dojo.charting”控件不僅包括基本的圖形(如:現狀圖、柱狀圖、餅狀圖),也包括很多復雜的工業級圖形(如股票走勢圖、雷達圖、甘特圖)。本篇僅介紹三種進本圖形:柱狀圖、餅狀圖、3D柱狀圖。
要想使用這些圖形需要引入如下命名空間:
View Code
dojo.require("dojox.charting.action2d.MoveSlice");
dojo.require("dojox.charting.Chart2D");
dojo.require("dojox.charting.Chart3D");
dojo.require("dojox.charting.plot3d.Bars");
dojo.require("dojox.charting.action2d.Highlight");
dojo.require("dojox.charting.action2d.Tooltip");
1、柱狀圖

首先創造一個div來承載圖形,
View Code
1 this.currentDiv = dojo.create("div"); 2 this.currentDiv.style.width = "280px"; 3 this.currentDiv.style.height = "230px"; 4 dijit.byId("siteBar").setContent(this.currentDiv);
設置圖標需要的數據,以及創建圖表
View Code
1 //圖標需要如下的數據數組 2 var dataSeries = [staObj["服裝"], staObj["電器"], staObj["百貨"], staObj["建材"], staObj["其他"]]; 3 //創建圖表並顯示在div中 4 var chartBar = new dojox.charting.Chart2D(this.currentDiv); 5 console.log("displayChartBar:創建繪圖區域");
下面進行圖表參數的設置,x軸、y軸
View Code
1 //增加X軸,但並不需要顯示 2 chartBar.addAxis("x", { 3 labels: [ 4 {value: 1, text: "服裝"}, 5 {value: 2, text: "電器"}, 6 {value: 3, text: "百貨"}, 7 {value: 4, text: "建材"}, 8 {value: 5, text: "其他"}], 9 majorTick: {length: 0}, 10 minorTick: {length: 0}, 11 natural: true 12 }); 13 //增加Y軸,但也不需要顯示 14 chartBar.addAxis("y", { 15 vertical: true, 16 stroke: "black", 17 fontColor: "black", 18 majorTick: {length: 0}, 19 minorTick: {length: 0}, 20 includeZero: true 21 });
定義圖表類型,為圖表添加數據,設置柱條的顏色
View Code
1 //定義圖標類型,這里用柱狀圖 2 chartBar.addPlot("default",{ 3 type: "Columns", 4 gap: 8, 5 font: "normal normal bold 8pt Tahoma", 6 fontColor: "black" 7 }); 8 //指定圖標使用的數據以及圖表中柱條的顏色 9 chartBar.addSeries("SeriesA", dataSeries, {stroke: {color: "steelblue"}, fill: "steelblue"});
設置圖形特效
View Code
1 //當鼠標移動到柱條上時高亮顯示 2 var anim1 = new dojox.charting.action2d.Highlight(chartBar, "default", {highlight: "lightskyblue"}); 3 var anim2 = new dojox.charting.action2d.Tooltip(chartBar, "default"); 4 //渲染 5 chartBar.render();
這里介紹幾個圖表中的特效:
Highlight:需要引入命名空間“dojox.charting.action2d.Highlight”;當將鼠標懸停與一個元素上方時,此動作突出顯示圖表的單獨元素
magnify: 同樣需要引入命名空間“dojox.charting.action2d.Magnify”,當鼠標懸停於某元素上方時,此動作擴大元素,該效果常與突出顯示同用
moveSlice:需要引入命名空間“dojox.charting.action2d.MoveSlice”;此動作常用於餅圖中,將餅圖稍微移除一部分,實際上是略微改變x和y值
shake:需要引入命名空間“dojox.charting.action2d.Shake”;鼠標懸停於某一元素時,繪制元素
2、餅圖

主要步驟同柱狀圖類似:
View Code
1 this.currentDiv = dojo.create("div"); 2 this.currentDiv.style.width = "280px"; 3 this.currentDiv.style.height = "230px"; 4 dijit.byId("sitePie").setContent(this.currentDiv); 5 6 var sum = staObj["服裝"]+staObj["電器"]+staObj["百貨"]+ staObj["建材"]+ staObj["其他"]; 7 //計算所占百分比 8 var fzPct = Math.round((staObj["服裝"] / sum) * 100); 9 var dqPct = Math.round((staObj["電器"] / sum) * 100); 10 var bhPct = Math.round((staObj["百貨"] / sum) * 100); 11 var jcPct = Math.round((staObj["建材"] / sum) * 100); 12 var qtPct = Math.round((staObj["其他"] / sum) * 100); 13 14 //使用餅圖 15 var chartPie = new dojox.charting.Chart2D(this.currentDiv); 16 chartPie.addPlot("default", { 17 type: "Pie", 18 font: "normal normal bold 8pt Tahoma", 19 fontColor: "black", 20 radius: 65, 21 labelOffset: -25 22 }); 23 //添加數據 24 chartPie.addSeries("Series A", [ 25 {y: staObj["服裝"], text: "服裝", color: "powderblue", stroke: "black", tooltip:"服裝:" + staObj["服裝"] + "(" + fzPct + "%)"}, 26 { y: staObj["電器"], text: "電器", color: "cadetblue", stroke: "black", tooltip: "電器: " + staObj["電器"] + " (" + dqPct + "%)" }, 27 { y: staObj["百貨"], text: "百貨", color: "cornflowerblue", stroke: "black", tooltip: "百貨: " + staObj["百貨"] + " (" + bhPct + "%)" }, 28 { y: staObj["建材"], text: "建材", color: "lightsteelblue", stroke: "black", tooltip: "建材: " + staObj["建材"] + " (" + jcPct + "%)" }, 29 { y: staObj["其他"], text: "其他", color: "dodgerblue", stroke: "black", tooltip: "其他" + staObj["其他"] + " (" + qtPct + "%)"} 30 ]); 31 //添加特殊效果與信息 32 var animMoveSlice = new dojox.charting.action2d.MoveSlice(chartPie, "default"); 33 var animHighlightSlice = new dojox.charting.action2d.Highlight(chartPie, "default"); 34 var animSliceTooltip = new dojox.charting.action2d.Tooltip(chartPie, "default"); 35 36 chartPie.render();
3、3D柱狀圖
View Code
1 this.currentDiv = dojo.create("div"); 2 this.currentDiv.style.width = "280px"; 3 this.currentDiv.style.height = "230px"; 4 dijit.byId("siteBar3D").setContent(this.currentDiv); 5 //配置參數 6 var m = dojox.gfx3d.matrix; 7 var chartBar3D = new dojox.charting.Chart3D(this.currentDiv,{ 8 lights: [{direction: {x:5,y:5,z:-5}, color: "white"}],//配置光源 9 ambient: {color: "white", intensity: 2},//設置物體環境參數 10 specular: "white"},//反射參數設定 11 [m.cameraRotateXg(10), m.cameraRotateYg(-10), m.scale(0.8), m.cameraTranslate(-50,-50,0)]//配置相機參數 12 ); 13 //設置繪制場景,數據 14 var plot1 = new dojox.charting.plot3d.Bars(200, 200, {gap:8, material:"#FE74FF"}); 15 plot1.setData([staObj["服裝"],staObj["電器"],staObj["百貨"],staObj["建材"],staObj["其他"]]); 16 chartBar3D.addPlot(plot1); 17 //渲染 18 chartBar3D.generate().render();
3D柱狀圖參數較為復雜:
Lights:這里主要用於配置光源,direction為光源的光照方向,color微光的顏色;
Ambient:設定物體的環境參數;
Specular:反射參數設定;
m.cameraRotateXg(10), m.cameraRotateYg(10);坐標參數旋轉
m.scale(0.8):鏡頭的縮放參數
m.cameraTranslate(-50, -50, 0):鏡頭的偏移,對應(x,y,z)
Material:三維物體的材質,主要用於配置其顏色外觀
以上是基本的繪圖介紹,想進一步了解繪圖內容請參考這篇文章:
http://www.ibm.com/developerworks/cn/web/1109_zhouxiang_dojocharting/index.html
