2011年7月29日 星期五

用PHP寫的Google Pie Chart (圖餅圖) API Class

最近在用PHP做一些Server的數據分析,做到一個程度後,突然覺得如果能把分析的結果做成圖表,可能會比較好,於是就開始找PHP的Chart Library,找到了幾個雖然都能用,但還是覺得不太滿意,到後來我想做圓餅圖時,就找不到什麼Library了,後來發現了原來Google有做了很強大的Chart API, 只要把相關參數用GET的方式傳到:http://chart.apis.google.com/chart,Google就可以幫我們做出我們要的圖表。


先直接用API畫個簡單的圓餅圖,


URL如下:


畫出來的結果如下圖:
圖1

詳細用法可參考官方說明文件:
http://code.google.com/intl/zh-TW/apis/chart/image/docs/gallery/pie_charts.html

由於我是要把自已分析好的各種數據做成各種圖表,如果每次要做圖,都要用這種方式搞一次,會讓我覺得很累,所以就先把Google Chart寫成一個基礎的Class, 之後再依據自已的需要針對各種圖表去繼承他。

以上面的例子,我只要先寫好一個GoogleChart.php的腳本,再像下面這樣寫,就可以做出上面的圖表(圖1)了。


include("GoogleChart.php");
$chart = new GooglePieChart(400,200);
$data = array(3,4,5);
$labels = array("標籤1","標籤2","標籤3");
$legends = array("圖例1","圖例2","圖例3");
$chart->setData($data,$labels,$legends);
$chart->draw();


雖然表面上看起來字是比較多,但實際上會比較容易理解,而且不管我的數據是什麼,我只要用1個陣列,就能產生出另外2個陣列來畫出我要的圖表,到時候也就差不多這幾行,另外一個好處就是,如果將來沒有其他特殊需求的話,以後就算過了很久,就算我都忘了Google API是長怎樣的了,但我只要看到上面那幾句,就能夠直接套用而不必再去爬文了。

GoogleChart.php程式如下,有需要的可以自已copy回去用:

class GoogleChart{
    var $width,$height;
    var $chart_type;
    var $api_url;
    var $parameters;
    function GoogleChart($w,$h,$type,$url="http://chart.apis.google.com/chart"){
        $this->parameters = array();
        $this->width = $w; 
        $this->height = $h; 
        $this->chart_type = $type;
        $this->api_url = $url;
        $this->parameters['chs'] = $w."x".$h;
        $this->parameters['cht'] = $type;
    }   


    function draw(){
        $url = $this->api_url;
        $params = array();
        foreach($this->parameters as $key => $value){
            $params[] = "$key=$value";
        }   
        $url .= "?".implode("&",$params);
        header("Location: $url");
    }   
} //class GoogleChart

class GooglePieChart extends GoogleChart{
    function GooglePieChart($w,$h,$type="p"){
        parent::GoogleChart($w,$h,$type);
    }   

    function setData($data,$labels=null,$legends=null){
        $this->parameters['chd'] = "t:".implode(",",$data);
        if($labels) $this->setLabels($labels);
        if($legends) $this->setLegends($legends);
    }   

    function setLabels($labels){
        $this->parameters['chl'] = implode("|",$labels);
    }

    function setLegends($legends){
        $this->parameters['chdl'] = implode("|",$legends);
    }
} //class GooglePieChart extends: GoogleChart

class GooglePieChart3D extends GooglePieChart{
    function GooglePieChart3D($w,$h){
        parent::GooglePieChart($w,$h,"p3");
    }
}

沒有留言:

張貼留言