php 饼图,php统计,如何生成饼图算法?

我看你上边说的已经排除js+flash这些,估计你的需求就是必须是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 

if(!is_numeric($shuju[$i])) die("1");

$total+=$shuju[$i];

}

//再次遍历,计算色块角度并存入数组

for ($i = 0; $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 

$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 

$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方式传入。

颜色图例,请自行排列:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值