如何使用PHP动态生成饼状图、柱状图和折线图[1]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 zzw45 的 blog

所有内容:如何使用php动态生成饼状图、折线图和柱状图
专题讨论区:http://hh.cc163.com/form/
主页:http://hh.cc163.com/

 

目录

  1. 饼装图
    1. 设计思路
    2. 实现过程
    3. 使用方法
    4. 实现效果
  2. 折线图
    1. 设计思路
    2. 实现过程
    3. 使用方法
    4. 实现效果
  3. 柱状图
    1. 设计思路
    2. 实现过程
    3. 使用方法
    4. 实现效果
  4. 参考文献
  5. 相关链接

 

php在图像操作方面的表现非常出色,我们只需借助可以免费得到的gd库便可以轻松实现图、表勾画。下面将分别介绍笔者实现的饼状图、折线图和柱状图以及他们的使用方法,这几段代码的特点就是不需要再把它们复制到你的代码之中,只需要把计算得到的数据作为参数传入,即可得到相应的图形效果

开发环境:php version 4.3.6+gd version bundled (2.0.22 compatible)

由于作者水平有限,文章中难免存在错误,我将非常感激您的指正

代码中所有使用的函数的说明,请参见php开发文档 点这里获得最新版

饼状图

设计思路

饼状图表对于查看一个值占总值的百分比是一个好的方法。我们就用php来实现一个饼形图表。
它的设计思想是:
1 接受参数,得到所有数值的和,得到每一个值占数值总和的比例。
2 根据比例计算每一个色块在图中的圆周角度
3 要产生立体效果,只需要用深颜色画出阴影就可以了


实现过程

<?
//参数以a为参数名传入,a的文本形态应该是用“,”分割的若干数字连接的字符串
//这里首先判断a是否存在
if($_get["a"]=="") die("0");
//将得到的数据分解,存入数组$shuju中
$shuju=split(",",$_get["a"]);
//再次判断数据的合法性,返回错误代码
if(count($shuju)==0) die("2");
//定义整个图形的宽度和高度
//读者可以根据需要修改这两个变量的值
$tukuan=300;
$tugao=150;

//定义一个数组,用来存放每一个色块的角度范围
$jiaodu = array();
//定义存贮数据和的变量
$total=0;
//遍历数组求和
for ($i = 0; $i < count($shuju); $i++) {
  if(!is_numeric($shuju[$i])) die("1");
  $total+=$shuju[$i];
}
//再次遍历,计算色块角度并存入数组
for ($i = 0; $i < count($shuju); $i++) {
  array_push ($jiaodu, round(360*$shuju[$i]/$total));
}

//创建图像
$image = imagecreate($tukuan, $tugao);
//定义一个灰色背景色,这个颜色其实就是大家很熟悉的页面色系16进制数字表示的#eeeeee
$white = imagecolorallocate($image, 0xee, 0xee, 0xee);

//再定义10对深浅对应的彩色,存入二维数组
$yanse = array(
  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)
  ),
  array(
    imagecolorallocate($image, 0x4f, 0x66, 0x00),
    imagecolorallocate($image, 0x00, 0x33, 0x00),
    imagecolorallocate($image, 0x48, 0x10, 0x00),
    imagecolorallocate($image, 0x7d, 0x64, 0x00),
    imagecolorallocate($image, 0x17, 0x30, 0x64),
    imagecolorallocate($image, 0x1a, 0x6a, 0x1a),
    imagecolorallocate($image, 0x97, 0x4b, 0x00),
    imagecolorallocate($image, 0x78, 0x79, 0x3c),
    imagecolorallocate($image, 0x55, 0x7e, 0x27),
    imagecolorallocate($image, 0x00, 0x93, 0x37)
  )
);

//由下至上画10个像素高的深色饼图,作为阴影
$yuanxin_x=$tukuan/2;
for ($h = $tugao/2+5; $h > $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);

本文关键:如何使用PHP动态生成饼状图、柱状图和折线图
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top