PHP實現動態產生餅狀圖、柱狀圖和折線圖(轉)
PHP在映像操作方面的表現非常出色,我們只需藉助可以免費得到的GD庫便可以輕鬆實現圖、表勾畫。下面將分別介紹PHP實現的餅狀圖、折線圖和柱狀圖以及他們的使用方法,這幾段代碼的特點就是不需要再把它們複製到你的代碼之中,只需要把計算得到的資料作為參數傳入,即可得到相應的圖形效果
代碼中所有使用的函數的說明,請參見php開發文檔
餅狀圖
設計思路
餅狀圖表對於查看一個值佔總值的百分比是一個好的方法。我們就用PHP來實現一個餅形圖表。
它的設計思想是:
1 接受參數,得到所有數值的和,得到每一個值占數值總和的比例。
2 根據比例計算每一個色塊在圖中的圓周角度
3 要產生立體效果,只需要用深顏色畫出陰影就可以了
實現過程
$tugao/2-5; $h--) {$kaishi=0;$jieshu=0;for ($i = 0; $i < count($shuju); $i++) {$kaishi=$kaishi+0;$jieshu=$kaishi+$jiaodu[$i];$yanse_i=fmod($i,10);imagefilledarc($image,$yuanxin_x,$h,$tukuan,$tugao-20,$kaishi,$jieshu,$yanse[1][$yanse_i],IMG_ARC_PIE);$kaishi+=$jiaodu[$i];$jieshu+=$jiaodu[$i];}}//在最高處(也就是$h最小時)畫一個淺色餅圖,這個淺色圖跟先畫上的深色餅圖就能產生立體效果了for ($i = 0; $i < count($shuju); $i++) {$kaishi=$kaishi+0;$jieshu=$kaishi+$jiaodu[$i];$yanse_i=fmod($i,10);imagefilledarc($image, $yuanxin_x, $h, $tukuan, $tugao-20, $kaishi, $jieshu, $yanse[0][$yanse_i], IMG_ARC_PIE);$kaishi+=$jiaodu[$i];$jieshu+=$jiaodu[$i];}//設定檔案頭 header('Content-type: image/png');//輸出映像imagepng($image);//釋放資源 imagedestroy($image);?>
使用方法
在需要顯示映像的位置插入如下代碼
a的文字格式設定是由“,”串連的若干個資料的字串,get方式傳入。
折線圖
設計思路
用折線圖表查看某一資料在單位時段內的變化趨勢是一個好的選擇。我們就用PHP來實現一個動態折線圖表。
它的設計思想是:
1 接受參數,得到所有數值的和,得到資料的最大值以確定縱軸的最大刻度值
2 根據資料個數確定映像的寬度,並畫出橫軸和縱軸座標及刻度
3 畫直線串連各點,為每個點填充一個2*2的矩形,突出點的位置
4 在每個點的右上方標註每個點的資料值
實現過程
$zuidashujuzhi) $zuidashujuzhi=$shuju[$i];}//得到映像寬度 $img_kuan=$zuo+$you+count($shuju)*$jiange;//然後建立映像資源 $image = imagecreate($img_kuan,$img_gao);//灰色背景$white = imagecolorallocate($image, 0xEE, 0xEE, 0xEE);//座標軸用黑色顯示$zuobiao_yanse = imagecolorallocate($image, 0x00, 0x00, 0x00);//折線用藍色顯示$xian_yanse = imagecolorallocate($image, 0x00, 0x00, 0xFF);//畫座標//橫軸imageline ( $image, $zuo, $img_gao-$xia, $img_kuan-$you/2, $img_gao-$xia, $zuobiao_yanse);//縱軸imageline ( $image, $zuo, $shang/2, $zuo, $img_gao-$xia, $zuobiao_yanse);//得到每個點的座標for($i=0;$icount($shuju)){imageline ( $image, $p_x[$i], $p_y[$i], $p_x[$i+1], $p_y[$i+1], $xian_yanse);imagefilledrectangle($image, $p_x[$i]-1, $p_y[$i]-1, $p_x[$i]+1, $p_y[$i]+1, $xian_yanse);}}//上一個迴圈沒有畫出最後一個點效果,這裡還要追加imagefilledrectangle($image, $p_x[count($shuju)-1]-1, $p_y[count($shuju)-1]-1, $p_x[count($shuju)-1]+1, $p_y[count($shuju)-1]+1, $xian_yanse);//標註資料值for($i=0;$i
使用方法
在需要顯示映像的位置插入如下代碼
其中a的值由你自己計算得出
a的文字格式設定是由“,”串連的若干個資料的字串,get方式傳入。
由於往圖形裡寫入中文需要更多PHP環境配置,所以這裡給出一個html解決方案,實用也很靈活:
大家只需要根據資料個數的不同,動態產生一個表格放置橫軸座標刻度名稱就行了,像這樣
柱狀圖
設計思路
還是要首先確定縱軸的刻度值,確定縱軸的刻度最大值
然後根據得到的資料個數確定映像的寬度,這時就可以建立映像了
計算每個色柱的高度,用高度可以計算出色柱的填充範圍
用直線畫出座標軸,標註刻度值
用矩形填充色柱,並在色柱上方標註資料值
用Html方式畫出需要的橫軸座標名稱
實現過程
$zuidashujuzhi) $zuidashujuzhi=$shuju[$i];}//計算映像寬度 $img_kuan=$zuo+$you+$jiange+count($shuju)*($kuan+$jiange);//映像高 $img_gao=170;//儲存色柱高度的數組$zhugaodu = array();$image = imagecreate($img_kuan,$img_gao);$white = imagecolorallocate($image, 0xEE, 0xEE, 0xEE);//色柱顏色$shuju_yanse =array(imagecolorallocate($image, 0x97, 0xbd, 0x00),imagecolorallocate($image, 0x00, 0x99, 0x00),imagecolorallocate($image, 0xcc, 0x33, 0x00),imagecolorallocate($image, 0xff, 0xcc, 0x00),imagecolorallocate($image, 0x33, 0x66, 0xcc),imagecolorallocate($image, 0x33, 0xcc, 0x33),imagecolorallocate($image, 0xff, 0x99, 0x33),imagecolorallocate($image, 0xcc, 0xcc, 0x99),imagecolorallocate($image, 0x99, 0xcc, 0x66),imagecolorallocate($image, 0x66, 0xff, 0x99));//座標軸顏色$zuobiao_yanse = imagecolorallocate($image, 0x00, 0x00, 0x00);//橫軸imageline ( $image, $zuo, $img_gao-$xia, $img_kuan-$you/2, $img_gao-$xia, $zuobiao_yanse);//縱軸imageline ( $image, $zuo, $shang/2, $zuo, $img_gao-$xia, $zuobiao_yanse);//縱軸刻度,縱軸上共標註4個點,所以這裡分別計算即可imageline ( $image, $zuo, $shang, $zuo+6, $shang, $zuobiao_yanse);imagestring ( $image, 3, $zuo/4, $shang,round($zuidashujuzhi), $zuobiao_yanse);imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*1/4, $zuo+6, round($shang+($img_gao-$shang-$xia)*1/4), $zuobiao_yanse);imagestring ( $image, 3, $zuo/4, $shang+($img_gao-$shang-$xia)*1/4,round($zuidashujuzhi*3/4), $zuobiao_yanse);imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*2/4, $zuo+6, $shang+($img_gao-$shang-$xia)*2/4, $zuobiao_yanse);imagestring ( $image, 3, $zuo/4, $shang+($img_gao-$shang-$xia)*2/4,round($zuidashujuzhi*2/4), $zuobiao_yanse);imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*3/4, $zuo+6, $shang+($img_gao-$shang-$xia)*3/4, $zuobiao_yanse);imagestring ( $image, 3, $zuo/4, $shang+($img_gao-$shang-$xia)*3/4,round($zuidashujuzhi*1/4), $zuobiao_yanse);//得到每個柱的高度for($i=0;$i
使用方法
在需要顯示映像的位置插入如下代碼
其中a的值由你自己計算得出
a的文字格式設定是由“,”串連的若干個資料的字串,get方式傳入。
同樣使用一個html解決方案,解決橫軸刻度名稱的問題:
根據資料個數的不同,動態產生一個表格放置橫軸座標刻度名稱就行了,像這樣