教程集 www.jiaochengji.com
教程集 >  脚本编程  >  php  >  正文 PHP GD库动态生成折线图的实例代码

PHP GD库动态生成折线图的实例代码

发布时间:2017-07-02   编辑:jiaochengji.com
本文介绍下,在php中使用免费的GD库,动态生成折线图的一例代码,有需要的朋友可以参考下。

本节内容:
php折线图、php柱状图、php饼状图的生成代码,使用php GD库生成。

说明:
本文介绍使用php的gd库生成饼状图、折线图和柱状图。
只需要把计算得到的数据作为参数传入,即可得到相应的图形效果折线图设计思路。
用折线图表查看某一数据在单位时段内的变化趋势是一个好的选择。

用PHP来实现一个动态折线图表。
设计思想:
1,接受参数,得到所有数值的和,得到数据的最大值以确定纵轴的最大刻度值
2,根据数据个数确定图像的宽度,并画出横轴和纵轴坐标及刻度
3,画直线连接各点,为每个点填充一个2*2的矩形,突出点的位置
4,在每个点的右上方标注每个点的数据值

例子:
 

复制代码 代码示例:

<?
/**
* php GD库生成折线图、柱状图、饼状图
* by www.jbxue.com
*/
$img_gao=170;
$img_kuan=0;
$jiange=30;//横坐标点与点之间的间隔,生成的图片宽度会根据传入数据的多少而自动变化
$zuo=20;//左侧留空
$you=20;//右侧留空
$shang=20;//上留空
$xia=20;//下留空
$zuidashujuzhi=1;
$p_x = array();//点横坐标
$p_y = array();//点纵坐标
$y_name=split(",",$_GET["x_name"]);
if ($_GET["a"]=="") die("error id:0");
$shuju=split(",",$_GET["a"]);
//得到纵轴最大值
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=$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;$i<count($shuju);$i++){
  array_push ($p_x, $zuo+$i*$jiange);
  array_push ($p_y, $shang+round(($img_gao-$shang-$xia)*(1-$shuju[$i]/$zuidashujuzhi)));
}
//纵轴刻度
imageline ( $image, $zuo, $shang, $zuo+6, $shang, $zuobiao_yanse);
imagestring ( $image, 1, $zuo/4, $shang,$zuidashujuzhi, $zuobiao_yanse);
imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*1/4, $zuo+6, $shang+($img_gao-$shang-$xia)*1/4, $zuobiao_yanse);
imagestring ( $image, 1, $zuo/4, $shang+($img_gao-$shang-$xia)*1/4,$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, 1, $zuo/4, $shang+($img_gao-$shang-$xia)*2/4,$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, 1, $zuo/4, $shang+($img_gao-$shang-$xia)*3/4,$zuidashujuzhi*1/4, $zuobiao_yanse);
//横轴刻度
for($i=0;$i<count($shuju);$i++){
  imageline ( $image, $zuo+$i*$jiange, $img_gao-$xia, $zuo+$i*$jiange, $img_gao-$xia-6, $zuobiao_yanse);
  imagestring ( $image, 1, $zuo+$i*$jiange-$jiange/4, $shang+($img_gao-$shang-$xia)+2,$y_name[$i], $zuobiao_yanse);
}

//折线
$shuju_yanse_int=0;
for($i=0;$i<count($shuju);$i++){
  if($i+1<>count($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<count($shuju);$i++){
  imagestring ( $image, 3, $p_x[$i]+4, $p_y[$i]-12,$shuju[$i], $zuobiao_yanse);
}
//设定文件头
header('Content-type: image/png');
//输出图像
imagepng($image);
//释放资源
imagedestroy($image);
?>

二,使用方法
在需要显示图像的位置插入以下代码:
 

复制代码 代码示例:
<img src="zhexian_img.php?a=5.4,2,30.2,4,0,6,7.7,3.8,2,3,4"/>

说明:
其中a的值由自己计算得出;
a的文本格式是由“,”连接的若干个数据的字符串,get方式传入。
由于往图形里写入中文需要更多PHP环境配置,这里给出一个html解决方案:
只需要根据数据个数的不同,动态生成一个表格放置横轴坐标刻度名称即可。

例子:
 

复制代码 代码示例:
<table width="550" border="0" cellspacing="0" cellpadding="0">
<tr align="center">
<?
for($i=0;$i<12;$i++) {
  echo "<td width=\"30\">".$i."月</td>";
}
?>
</tr>
</table>

您可能感兴趣的文章:
windows下开启PHP GD库的方法
Linux下开启PHP GD库支持
php开启GD库(windows环境)
php GD库函数getimagesize()的用法
PHP图片裁剪函数(图像不变形)
php绘图不显示图片怎么办
PHP GD库动态生成折线图的实例代码
php gd库的基础知识
用PHP创建动态图形
php自动生成横状百分比图片的实现代码

[关闭]
~ ~