PHP的GD库很好很强大,最近在做数据统计的时候突然有想法想做成动态的统计图,以前BLOG发有几个FLASH统计图也很不错,但是既然这阵子研究起来PHP的图像处理,就试着弄个图片格式的统计图吧,先看效果:
是不是感觉还不错,呵呵,代码如下:拿去自己修改吧,链接数据库的代码就省略了,这里仅以字符串做演示:
柱状图:
PHP代码- <?php
- $a="200,120,400,200";
- $b="BOJI,XZJZ,HSZH,LYBR";
- ?>
- <?
- $kuan=50;//色柱宽
- $jiange=40;//色柱间间隔
- $zuo=40;//左侧留空
- $you=40;//右侧留空
- $shang=40;//上留空
- $xia=30;//下留空
- $zuidashujuzhi=1;//初始化纵轴最大数据值
- if ($a=="") die("error id:a0");
- if ($b=="") die("error id:b0");
- $shuju=split(",",$a);
- $lm=split(",",$b);
- //得到最大值
- for ($i=0;$i<count($shuju);$i++){
- if(!is_numeric($shuju[$i])) die("error id:1");
- if($shuju[$i]>$zuidashujuzhi) $zuidashujuzhi=$shuju[$i];
- }
- //计算图像宽度
- $img_kuan=600;//根据数据设定宽度用则改为$img_kuan=$zuo+$you+$jiange+count($shuju)*($jiange);
- //图像高
- $img_gao=250;
- //存储色柱高度的数组
- $zhugaodu = array();
- $image = imagecreate($img_kuan,$img_gao);
- $white = imagecolorallocate($image, 255, 255, 255);
- //色柱颜色
- $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, 120, 120, 120);
- //横轴
- 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<count($shuju);$i++){
- array_push ($zhugaodu, round(($img_gao-$shang-$xia)*$shuju[$i]/$zuidashujuzhi));
- }
- //画数据柱
- $shuju_yanse_int=0;
- for($i=0;$i<count($shuju);$i++){
- imagefilledrectangle( $image,$zuo+$jiange+$i*($kuan+$jiange),$shang+($img_gao-$shang-$xia)-$zhugaodu[$i],$zuo+$jiange+$i*($kuan+$jiange)+$kuan,($img_gao-$xia)-1 ,$shuju_yanse[$shuju_yanse_int]);
- //因为只定义了10种颜色,所以这里做一个循环
- if($shuju_yanse_int==9){
- $shuju_yanse_int=0;
- }else{
- $shuju_yanse_int++;
- }
- }
- //标注数据柱上方数据值
- for($i=0;$i<count($shuju);$i++){
- imagestring ( $image, 2, $zuo+$jiange+$i*($kuan+$jiange)+2,$shang+($img_gao-$shang-$xia)-$zhugaodu[$i]-15,$shuju[$i]." R", $zuobiao_yanse);
- imagestring ( $image, 3, $zuo+$jiange+$i*($kuan+$jiange)+10,$img_gao-$shang+15,$lm[$i], $zuobiao_yanse);
- }
- header('Content-type: image/png');
- imagepng($image);
- imagedestroy($image);
- ?>
折线图:
PHP代码- <?php
- $a="200,120,400,200,340,500,450";
- $b="Jan,Feb,Mar,Apr,May,Jue";
- ?>
- <?
- $jiange=40;//折点间隔
- $zuo=40;//左侧留空
- $you=40;//右侧留空
- $shang=40;//上留空
- $xia=30;//下留空
- $zuidashujuzhi=1;//初始化纵轴最大数据值
- if ($a=="") die("error id:a0");
- if ($b=="") die("error id:b0");
- $shuju=split(",",$a);
- $lm=split(",",$b);
- //得到最大值
- for ($i=0;$i<count($shuju);$i++){
- if(!is_numeric($shuju[$i])) die("error id:1");
- if($shuju[$i]>$zuidashujuzhi) $zuidashujuzhi=$shuju[$i];
- }
- //计算图像宽度
- $img_kuan=500;//根据数据设定宽度用则改为$img_kuan=$zuo+$you+$jiange+count($shuju)*($jiange);
- //图像高
- $img_gao=150;
- //存储折点高度的数组
- $zdgaodu = array();
- $image = imagecreate($img_kuan,$img_gao);
- $white = imagecolorallocate($image, 250, 250, 250);
- //色柱颜色
- $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)
- );
- //虚线颜色
- $xuyanse = imagecolorallocate($image, 230, 230, 230);
- //坐标轴颜色
- $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<count($shuju);$i++){
- array_push ($zdgaodu, round($img_gao-($img_gao-$shang-$xia)*$shuju[$i]/$zuidashujuzhi));
- }
- //创建折线图
- for ($i=0; $i<count($shuju)-1; $i++){
- imageline($image, $zuo+$i*$jiange, $zdgaodu[$i]-$xia, $zuo+($i+1)*$jiange, $zdgaodu[$i+1]-$xia, $shuju_yanse);
- }
- //创建虚线
- for ($i=1; $i<count($shuju)-1; $i++){
- imageline($image, $zuo+$i*$jiange, $zdgaodu[$i]-$xia+2, $zuo+$i*$jiange, $img_gao-$xia-2, $xuyanse);
- }
- //标注数据值
- for($i=0;$i<count($shuju);$i++){
- imagestring ( $image, 2, $zuo+$i*$jiange+2,$zdgaodu[$i]-$xia-15,$shuju[$i], $zuobiao_yanse);
- imagestring ( $image, 3, $zuo+$i*$jiange,$img_gao-$shang+15,$lm[$i], $zuobiao_yanse);
- }
- header('Content-type: image/png');
- imagepng($image);
- imagedestroy($image);
- ?>
设想一下,在统计数据库的某项数据的时候,如果动态的生成这样直观而又美观的的统计图表,是个不错的想法。