RELATEED CONSULTING
相關咨詢
選擇下列産品馬上(shàng)在線溝通(tōng)
服務時(shí)間(jiān):9:00-18:00
你(nǐ)可(kě)能遇到了下面的問題
關閉右側工具欄
使用Highcharts結合PHP與Mysql生(shēng)成餅狀圖
  • 作(zuò)者:admin
  • 發表時(shí)間(jiān):2013-07-02 14:17:06
  • 來(lái)源:未知

我們在做(zuò)複雜的數(shù)據統計(jì)功能時(shí)會(huì)用到餅狀圖,餅狀圖用整個(gè)圓表示總體(tǐ)的數(shù)量或整體(tǐ)值1,用圓內(nèi)各個(gè)扇形的大(dà)小(xiǎo)表示各部分數(shù)量或該部分占總體(tǐ)的百分比,它可(kě)以清晰直觀的表示各部分之間(jiān)以及各部分與整體(tǐ)之間(jiān)的數(shù)量關系。

本文将結合實際,使用PHP讀取Mysql數(shù)據表中的數(shù)據,并将獲取的數(shù)據按照要求輸出給前端JS,再通(tōng)過配置調用Highcharts圖表庫生(shēng)成餅狀圖。

 

查看演示DEMO 下載源碼

1、準備

為(wèi)了更好的講解,實例中在Mysql數(shù)據庫中建立一張表chart_pie,用于表示各搜索引擎帶來(lái)的訪問量,表中分别有(yǒu)id、title和(hé)pv三個(gè)字段,id是自增長整型、主鍵;title表示搜素引擎的名稱,pv表示對應的訪問量。chart_pie表中已預置了相關數(shù)據,如圖:

 

2、PHP

在pie.php文件中,寫入如下代碼:

include_once('connect.php'); //連接數(shù)據庫
$res = mysql_query("select * from chart_pie");
while($row = mysql_fetch_array($res)){
	$arr[] = array(
		$row['title'],intval($row['pv'])
	);
}
$data = json_encode($arr);

代碼中使用原生(shēng)的PHP查詢mysq數(shù)據的方法,将查詢的結果集保存在一個(gè)數(shù)組$arr裏,并将該數(shù)組轉換 以備前端js調用。

3、Javascript

通(tōng)過配置Highcharts,可(kě)以生(shēng)成一個(gè)漂亮的餅狀圖,詳見代碼及注釋,如果你(nǐ)還(hái)不知道(dào)Highcharts是什麽東東,請(qǐng)查閱本站(zhàn)(helloweba.com)前面的相關文章。

var chart;
$(function() {
	chart = new Highcharts.Chart({
        chart: {
            renderTo: 'chart_pie',  //餅狀圖關聯html元素id值
			defaultSeriesType: 'pie', //默認圖表類型為(wèi)餅狀圖
			plotBackgroundColor: '#ffc',  //設置圖表區(qū)背景色
            plotShadow: true   //設置陰影(yǐng)
        },
        title: {
            text: '搜索引擎統計(jì)分析'  //圖表标題
        },
		credits: {
			text: 'helloweba.com'
		},
        tooltip: {
            formatter: function() { //鼠标滑向圖像提示框的格式化提示信息
                return '' + this.point.name + ': ' + 
                twoDecimal(this.percentage) + ' %';
            }
        },
        plotOptions: {
            pie: {
                allowPointSelect: true, //允許選中,點擊選中的扇形區(qū)可(kě)以分離出來(lái)顯示
                cursor: 'pointer',  //當鼠标指向扇形區(qū)時(shí)變為(wèi)手型(可(kě)點擊)
				//showInLegend: true,  //如果要顯示圖例,可(kě)将該項設置為(wèi)true
                dataLabels: {
                    enabled: true,  //設置數(shù)據标簽可(kě)見,即顯示每個(gè)扇形區(qū)對應的數(shù)據
                    color: '#000000',  //數(shù)據顯示顔色
                    connectorColor: '#999',  //設置數(shù)據域扇形區(qū)的連接線的顔色
					style:{
						fontSize: '12px'  //數(shù)據顯示的大(dà)小(xiǎo)
					},
                    formatter: function() { //格式化數(shù)據
                        return '' + this.point.name + ': ' + 
                        twoDecimal(this.percentage) + ' %';
                    }
                }
            }
        },
        series: [{ //數(shù)據列
            name: 'search engine',
			data:  //核心數(shù)據列來(lái)源于php讀取的數(shù)據并解析成JSON
        }]
    });
});

上(shàng)述代碼中,核心數(shù)據data來(lái)源于pie.php中php轉換的json數(shù)據:$data。轉換後輸出的JSON數(shù)據格式為(wèi):

[["\u767e\u5ea6",1239],["google",998],["\u641c\u641c",342],["\u5fc5\u5e94",421],
["\u641c\u72d7",259],["\u5176\u4ed6",83]]

不用擔心,Highcharts會(huì)自動将JSON數(shù)據解析處理(lǐ),并生(shēng)成百分比的數(shù)據。

其實,Highcharts生(shēng)成的餅狀圖還(hái)可(kě)以設置默認初始選中的扇形,即默認選中的扇形會(huì)從整圓形中分離出來(lái),以便突出顯示。該效果要求默認data格式為(wèi):

[{"name":"\u767e\u5ea6","y":1239,"sliced":true,"selected":true},["google",998],
["\u641c\u641c",342],["\u5fc5\u5e94",421],["\u641c\u72d7",259],["\u5176\u4ed6",83]]

注意看代碼中前部分:{"name":"\u767e\u5ea6","y":1239,"sliced":true,"selected":true},這個(gè)字符串如何用PHP得(de)到呢?這就要修改pie.php中的php部分代碼:

while($row = mysql_fetch_array($res)){
	if($row['id']==1){
		$arr1[] = array(
			"name" =>  $row['title'],
			"y" => intval($row['pv']),
			"sliced" => true,  //默認分離
			"selected" => true  //默認選中
		); 
	}else{
		$arr[] = array(
		    $row['title'],intval($row['pv'])
	    );
	}
}
//合并數(shù)組
$arrs = array_merge($arr1,$arr);
$data = json_encode($arrs);

我們在循環遍曆結果集時(shí),當id為(wèi)1時(shí),将該項設置為(wèi)默認選中扇形區(qū),構建數(shù)組$arr1,否則構建另一個(gè)數(shù)組$arr,然後将這兩個(gè)數(shù)組合并,并将合并後的數(shù)組轉換為(wèi)json數(shù)據,供Highcharts調用。

此外,格式化數(shù)據市,如果要顯示百分比,可(kě)使用this.percentage,Highcharts會(huì)自動将整數(shù)轉換為(wèi)百分數(shù),如果要顯示數(shù)據量,直接使用this.y。

使用百分比:

formatter: function() { //格式化數(shù)據
    return '' + this.point.name + ': ' + twoDecimal(this.percentage) + ' %';
}

使用實際數(shù)據:

formatter: function() { //格式化數(shù)據
	return '' + this.point.name + ': ' + this.y ;
}

注意:在使用百分比數(shù)據時(shí),需要将數(shù)據強制(zhì)保留兩位小(xiǎo)數(shù),否則有(yǒu)可(kě)能出現37.0000000001的情況,而實際上(shàng)是37%。保留2位小(xiǎo)數(shù)的JS函數(shù)twoDecimal()請(qǐng)下載本例demo源碼。