当前位置:首页 > 打造超酷的PHP数据饼图

打造超酷的PHP数据饼图

点击次数:1268  更新日期:2011-01-03
\n


\n

源代码:

PHP代码如下:


\n

//+————————+
//| pie3dfun.PHP//公用函数 |
//+————————+

define(“ANGLE_STEP”, 5);
//定义画椭圆弧时的角度步长

function draw_getdarkcolor(img,clr)
//求clr对应的暗色
{
rgb = imagecolorsforindex(img,clr
);
return array(rgb["red"]/2,rgb["green"]/2,rgb["blue"]/2
);
}

function draw_getexy(a, b, d)
//求角度d对应的椭圆上的点坐标
{
d = deg2rad(d
);
return array(round(a*Cos(d)), round(b*Sin(d
)));
}

function draw_arc(img,ox,oy,a,b,sd,ed,clr)
//椭圆弧函数
{
n = ceil((ed-sd)/ANGLE_STEP
);
d = sd
;
list(x0,y0) = draw_getexy(a,b,d
);
for(i=0; i<n; i
++)
{
d = (d+ANGLE_STEP)>ed?ed:(d+ANGLE_STEP
);
list(x, y) = draw_getexy(a, b, d
);
imageline(img, x0+ox, y0+oy, x+ox, y+oy, clr
);
x0 = x
;
y0 = y
;
}
}

function draw_sector(img, ox, oy, a, b, sd, ed, clr)
//画扇面
{
n = ceil((ed-sd)/ANGLE_STEP
);
d = sd
;
list(x0,y0) = draw_getexy(a, b, d
);
imageline(img, x0+ox, y0+oy, ox, oy, clr
);
for(i=0; i<n; i
++)
{
d = (d+ANGLE_STEP)>ed?ed:(d+ANGLE_STEP
);
list(x, y) = draw_getexy(a, b, d
);
imageline(img, x0+ox, y0+oy, x+ox, y+oy, clr
);
x0 = x
;
y0 = y
;
}
imageline(img, x0+ox, y0+oy, ox, oy, clr
);
list(x, y) = draw_getexy(a/2, b/2, (d+sd)/2
);
imagefill(img, x+ox, y+oy, clr
);
}

function draw_sector3d(img, ox, oy, a, b, v, sd, ed, clr)
//3d扇面
{
draw_sector(img, ox, oy, a, b, sd, ed, clr
);
if(sd<180
)
{
list(R, G, B) = draw_getdarkcolor(img, clr
);
clr=imagecolorallocate(img, R, G, B
);
if(ed>180) ed = 180
;
list(sx, sy) = draw_getexy(a,b,sd
);
sx += ox
;
sy += oy
;
list(ex, ey) = draw_getexy(a, b, ed
);
ex += ox
;
ey += oy
;
imageline(img, sx, sy, sx, sy+v, clr
);
imageline(img, ex, ey, ex, ey+v, clr
);
draw_arc(img, ox, oy+v, a, b, sd, ed, clr
);
list(sx, sy) = draw_getexy(a, b, (sd+ed)/2
);
sy += oy+v/2
;
sx += ox
;
imagefill(img, sx, sy, clr
);
}
}
function draw_getindexcolor(img, clr)
//RBG转索引色

{
R = (clr>>16) & 0xff
;
G = (clr>>8)& 0xff
;
B = (clr) & 0xff
;
return imagecolorallocate(img, R, G, B
);
}

// 绘图主函数,并输出图片
// datLst 为数据数组, datLst 为标签数组, datLst 为颜色数组
// 以上三个数组的维数应该相等
function draw_img(datLst,labLst,clrLst,a=250,b=120,v=20,font=10
)
{
ox = 5+a
;
oy = 5+b
;
fw = imagefontwidth(font
);
fh = imagefontheight(font
);

n = count(datLst);
//数据项个数

w = 10+a*2
;
h = 10+b*2+v+(fh+2)*n
;

img = imagecreate(w, h
);

//转RGB为索引色
for(i=0; i<n; i
++)
clrLst[i] = draw_getindexcolor(img,clrLst[i
]);

clrbk = imagecolorallocate(img, 0xff, 0xff, 0xff
);
clrt = imagecolorallocate(img, 0×00, 0×00, 0×00
);

//填充背景色
imagefill(img, 0, 0, clrbk
);

//求和
tot = 0
;
for(i=0; i<n; i
++)
tot += datLst[i
];
sd = 0
;
ed = 0;
333
ly = 10+b*2+v
;
for(i=0; i<n; i
++)
{
sd = ed
;
ed += datLst[i]/tot*360
;

//画圆饼
draw_sector3d(img, ox, oy, a, b, v, sd, ed, clrLst[i]);
//sd,ed,clrLst[i]);

//画标签
imagefilledrectangle(img, 5, ly, 5+fw, ly+fh, clrLst[i
]);
imagerectangle(img, 5, ly, 5+fw, ly+fh, clrt
);
//imagestring(img, font, 5+2*fw, ly, labLst[i].”:”.datLst[i].”(“.(round(10000*(datLst[i]/tot))/100).”%)”, clrt);

str = iconv(“GB2312″, “UTF-8″, labLst[i
]);
ImageTTFText(img, font, 0, 5+2*fw, ly+13, clrt, “./simsun.ttf”, str.”:”.datLst[i].”(“.(round(10000*(datLst[i]/tot))/100).”%)”
);
ly += fh+2
;
}

//输出图形
header(“Content-type: image/png”
);

//输出生成的图片
imgFileName = “../temp/”.time().”.png”
;
imagepng(img,imgFileName
);
echo ”””””””””””””””””””””””””””””””””””’

}

datLst = array(30, 10, 20, 20, 10, 20, 10, 20); //数据
labLst = array(“中国科技大学”, “安徽理工大学”, “清华大学”, “北京大学”, “南京大学”, “上海大学”, “河海大学”, “中山大学”); //标签
clrLst = array(0x99ff00, 0xff6666, 0x0099ff, 0xff99ff, 0xffff99, 0x99ffff, 0xff3333, 0×009999);

//画图
draw_img(datLst,labLst,clrLst);
?>

\n