最近因為業務上的需要,接觸到了一些JQuery的繪圖Plugin,很適合用來製作後台數據分析的圖表,就來跟大家作個心得分享。
這次介紹的是Flot(http://code.google.com/p/flot/)這套Plugin。
當初會選用這套Plugin除了他的呈現方式很多元所以可以套用在各個不同的場合外,最重要的是他非常的簡單易用,而且有放出一些簡易的API,可以作細部的調控。
首先先來看他提供的範例:
下方的Show是透過AJAX的方法可以動態將資料加入圖表中,這功能很適合用來作各資料(例如媒體成效)間的評比,因為可以自由選擇單筆或多筆資料,這樣子成效一眼就可以看出,對於作資料彙總與分析很有幫助。
接下來開始來介紹這套Plugin的用法:
首先我們先來研究他的原始碼
因為是JQuery的Plugin,因此jquery.js必不可少,Plugin的檔案為jquery.flot.js,也要一併載進來。另外可以發現到他有對IE作控制,這部分經測試是可以正常在IE使用的,請安心服用。
<link href="layout.css" rel="stylesheet" type="text/css"></link> <!--[if IE]><script language="javascript" type="text/javascript" src="../excanvas.min.js"></script><![endif]--> <script language="javascript" type="text/javascript" src="../jquery.js"></script> <script language="javascript" type="text/javascript" src="../jquery.flot.js"></script>
這部分可以很清楚發現他的資料是用多重陣列的方式作儲存的,也就是說我們重資料庫撈出來的資料必須要整理成這個樣子才有辦法正確顯示出來。
$(function () { var datasets = { "usa": { label: "USA", data: [[1988, 483994], [1989, 479060], [1990, 457648], [1991, 401949], [1992, 424705], [1993, 402375], [1994, 377867], [1995, 357382], [1996, 337946], [1997, 336185], [1998, 328611], [1999, 329421], [2000, 342172], [2001, 344932], [2002, 387303], [2003, 440813], [2004, 480451], [2005, 504638], [2006, 528692]] }, "russia": { label: "Russia", data: [[1988, 218000], [1989, 203000], [1990, 171000], [1992, 42500], [1993, 37600], [1994, 36600], [1995, 21700], [1996, 19200], [1997, 21300], [1998, 13600], [1999, 14000], [2000, 19100], [2001, 21300], [2002, 23600], [2003, 25100], [2004, 26100], [2005, 31100], [2006, 34700]] }, "uk": { label: "UK", data: [[1988, 62982], [1989, 62027], [1990, 60696], [1991, 62348], [1992, 58560], [1993, 56393], [1994, 54579], [1995, 50818], [1996, 50554], [1997, 48276], [1998, 47691], [1999, 47529], [2000, 47778], [2001, 48760], [2002, 50949], [2003, 57452], [2004, 60234], [2005, 60076], [2006, 59213]] }, "germany": { label: "Germany", data: [[1988, 55627], [1989, 55475], [1990, 58464], [1991, 55134], [1992, 52436], [1993, 47139], [1994, 43962], [1995, 43238], [1996, 42395], [1997, 40854], [1998, 40993], [1999, 41822], [2000, 41147], [2001, 40474], [2002, 40604], [2003, 40044], [2004, 38816], [2005, 38060], [2006, 36984]] }, "denmark": { label: "Denmark", data: [[1988, 3813], [1989, 3719], [1990, 3722], [1991, 3789], [1992, 3720], [1993, 3730], [1994, 3636], [1995, 3598], [1996, 3610], [1997, 3655], [1998, 3695], [1999, 3673], [2000, 3553], [2001, 3774], [2002, 3728], [2003, 3618], [2004, 3638], [2005, 3467], [2006, 3770]] }, "sweden": { label: "Sweden", data: [[1988, 6402], [1989, 6474], [1990, 6605], [1991, 6209], [1992, 6035], [1993, 6020], [1994, 6000], [1995, 6018], [1996, 3958], [1997, 5780], [1998, 5954], [1999, 6178], [2000, 6411], [2001, 5993], [2002, 5833], [2003, 5791], [2004, 5450], [2005, 5521], [2006, 5271]] }, "norway": { label: "Norway", data: [[1988, 4382], [1989, 4498], [1990, 4535], [1991, 4398], [1992, 4766], [1993, 4441], [1994, 4670], [1995, 4217], [1996, 4275], [1997, 4203], [1998, 4482], [1999, 4506], [2000, 4358], [2001, 4385], [2002, 5269], [2003, 5066], [2004, 5194], [2005, 4887], [2006, 4891]] } };
下面就是他主要程式運作的部分,也是可以呼叫API的地方。
var i = 0; $.each(datasets, function(key, val) { val.color = i; ++i; }); // insert checkboxes var choiceContainer = $("#choices"); $.each(datasets, function(key, val) { choiceContainer.append('<br/><input type="checkbox" name="' + key + '" checked="checked" id="id' + key + '">' + '<label for="id' + key + '">' + val.label + '</label>'); }); choiceContainer.find("input").click(plotAccordingToChoices); function plotAccordingToChoices() { var data = []; choiceContainer.find("input:checked").each(function () { var key = $(this).attr("name"); if (key && datasets[key]) data.push(datasets[key]); }); if (data.length > 0) $.plot($("#placeholder"), data, { yaxis: { min: 0 }, xaxis: { tickDecimals: 0 } }); } plotAccordingToChoices(); });
範例分析完了,接下來就是看怎麼跟資料庫裡的資料作搭配了,這部分基本上就是透過MySQL和PHP的配合,將資料轉換成
datasets = { "usa": { label: "USA", data: [[1988, 483994], [1989, 479060], .... }, .... }
這種格式,其中應該注意的是label的值會出現在Show和圖的右上角,代表該筆資料的標籤;data值一組有兩個值,第一個值代表X軸數值,第二個值代表T軸數值,這部分有個重點,這兩者皆需要是Number的資料型態,Flot才有辦法運作。
這樣子初步的圖表就完成了。
但是我們常用的圖表X軸部分常常都是日期而不是數值,這部分又該怎麼處理呢?
還好Flot提供了API可以讓我們使用,我們可以透過
xaxis: { mode: "time" timeformat: "%y/%m/%d" }
這樣的設定來輕易達成我們的目標,不過這時候data的第一個數值必須經過處理,例如在PHP中必須使用
strtotime("2002-02-20 UTC+0800") * 1000
這種方式才能夠正常使用Flot的功能。
這樣就可以完成一個實用的圖表了。