程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP中用GD繪制餅圖,gd繪制餅

PHP中用GD繪制餅圖,gd繪制餅

編輯:關於PHP編程

PHP中用GD繪制餅圖,gd繪制餅


PHP中用GD繪制餅圖,繪制的類見代碼:

  1 Class Chart{
  2     private $image; // 定義圖像
  3     private $title; // 定義標題
  4     private $ydata; // 定義Y軸數據
  5     private $xdata; // 定義X軸數據
  6     private $color; // 定義條形圖顏色
  7     private $bgcolor; // 定義圖片背景顏色
  8     private $width; // 定義圖片的寬
  9     private $height; // 定義圖片的長
 10     
 11     /*
 12      * 構造函數 
 13      * String title 圖片標題
 14      * Array xdata 索引數組,X軸數據
 15      * Array ydata 索引數組,數字數組,Y軸數據
 16      */
 17     function __construct($title,$xdata,$ydata) {        
 18         $this->title = $title;
 19         $this->xdata = $xdata;
 20         $this->ydata = $ydata;
 21         $this->color = array('#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4');
 22     }
 23     
 24     /*
 25      * 公有方法,設置條形圖的顏色 
 26      * Array color 顏色數組,元素取值為'#058DC7'這種形式
 27      */
 28     function setBarColor($color){
 29         $this->color = $color;
 30     }
 31     
 32     /*
 33      * 繪制餅圖
 34      */
 35     function mkPieChart() {
 36         $sum = array_sum($this->ydata); // 獲取ydata所有元素之和
 37         $start = 0; // 弧的開始角度
 38         $end = 0; // 弧的結束角度
 39         $pieWidth =  300; // 橢圓的長軸
 40         $pieHeight = 220; // 橢圓的短軸
 41         $space = 40; // 橢圓與小矩形的間距
 42         $margin = 20; // 圖片的邊距
 43         $recWidth = 20; // 小矩形的寬
 44         $recHeight = 15; // 小矩形的高
 45         $titleHeight = 50; // 標題區域的高
 46         // 圖片自適應寬與高
 47         $this->width = $pieWidth + $this->arrayLengthMax($this->xdata)*10*4/3 + $space + $recWidth +$margin;
 48         $this->height =  (($pieHeight > count($this->xdata)*25 ) ? $pieHeight : count($this->xdata)*25) + $titleHeight;
 49         // 橢圓中心的坐標
 50         $cx = $pieWidth/2+$margin;
 51         $cy = $pieHeight/2+$titleHeight;
 52         
 53         $this->image = imagecreatetruecolor($this->width ,$this->height); // 准備畫布
 54         $this->bgcolor = imagecolorallocate($this->image,255,255,255); // 圖片的背景顏色
 55         imagefill($this->image,0,0,$this->bgcolor); // 填充背景
 56         
 57         // 設置條形圖的顏色
 58         $color = array();
 59         foreach($this->color as $col) {
 60             $col = substr($col,1,strlen($col)-1);
 61             $red = hexdec(substr($col,0,2));
 62             $green = hexdec(substr($col,2,2));
 63             $blue = hexdec(substr($col,4,2));
 64             $color[] = imagecolorallocate($this->image ,$red, $green, $blue);
 65         }
 66         
 67         // 設置線段的顏色、字體的顏色、字體的路徑
 68         $lineColor = imagecolorallocate($this->image ,0xcc,0xcc,0xcc);
 69         $fontColor = imagecolorallocate($this->image, 0x95,0x8f,0x8f);
 70         $fontPath = 'font/simsun.ttc';
 71         
 72         // 繪制扇形弧 
 73         for($i = 0; $i < 10; $i++) {
 74             foreach($this->ydata as $key => $val) {
 75                 $end += 360*$val/$sum;
 76                 imagefilledarc($this->image,$cx,$cy-$i,$pieWidth,$pieHeight, $start,$end,$color[$key%count($this->color)],IMG_ARC_PIE);        
 77                 $start = $end;                
 78             }
 79         }
 80         
 81         // 繪制小矩形及之後文字說明
 82         $x1 = $pieWidth+$space;
 83         $y1 = $titleHeight ;
 84         foreach($this->ydata as $key => $val) {
 85             imagefilledrectangle($this->image,$x1,$y1,$x1+$recWidth,$y1+$recHeight,$color[$key%count($this->color)]);        
 86             imagettftext($this->image,10,0,$x1+$recWidth+5,$y1+$recHeight-2,$fontColor,$fontPath,$this->xdata[$key]);
 87             $y1 += $recHeight + 10;            
 88         }
 89         
 90         // 繪畫標題
 91         $titleStart = ($this->width - 5.5*strlen($this->title))/2;
 92         imagettftext($this->image,11,0,$titleStart,20,$fontColor,$fontPath,$this->title);
 93         
 94         // 輸出圖片
 95         header("Content-Type:image/png");
 96         imagepng($this->image);
 97     } 
 98     
 99     /*
100      * 私有方法,求數組中元素長度最大的值 
101      * Array arr 字符串數組,必須是漢字
102      */
103     private function arrayLengthMax($arr) {
104         $length = 0;
105         foreach($arr as $val) {
106             $length = strlen($val) > $length ? strlen($val) : $length;
107         }
108         return $length/3;
109     } 
110     
111     // 析構函數
112     function __destruct(){
113         imagedestroy($this->image);
114     }
115  }

測試代碼如下:

1 $xdata = array('測試一','測試二','測試三','測試四','測試五','測試六','測試七','測試八','測試九');
2 $ydata = array(89,90,90,23,35,45,56,23,56);
3 $Img = new Chart($title,$xdata,$ydata);
4 $Img->mkPieChart();

 

效果圖如下:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved