PHP中利用GD实现的柱状图,自己写的一个画柱状图的类,上代码。

 <?php
Class Chart{
private $image; // 定义图像
private $title; // 定义标题
private $ydata; // 定义Y轴数据
private $xdata; // 定义X轴数据
private $color; // 定义条形图颜色
private $bgcolor; // 定义图片背景颜色
private $width; // 定义图片的宽
private $height; // 定义图片的长 /*
* 构造函数
* String title 图片标题
* Array xdata 索引数组,X轴数据
* Array ydata 索引数组,数字数组,Y轴数据
*/
function __construct($title,$xdata,$ydata) {
$this->title = $title;
$this->xdata = $xdata;
$this->ydata = $ydata;
$this->color = array('#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4');
} /*
* 公有方法,设置条形图的颜色
* Array color 颜色数组,元素取值为'#058DC7'这种形式
*/
function setBarColor($color){
$this->color = $color;
} /*
* 公有方法,画条形图
*/
function mkBarChart(){
$ydataNum = $this->arrayNum($this->ydata); // 取得数据分组的个数
$max = $this->arrayMax($this->ydata); // 取得所有呈现数据的最大值
$multi = ($max > 100)? $max/100 : 1; // 如果最大数据是大于100的则进行缩小处理,获取
$barHeightMulti = 2.2; // 条形高缩放的比例
$barWidth = (16 - 2*($ydataNum - 1)) > 10 ? (16 - 2*($ydataNum - 1)) : 10; // 条的宽
$barSpace = 16; // 条之间的间距
$chartLeft = (1+strlen($max))*12; // 设置图片左边的margin $barY = 250; // 初始化条形图的Y的坐标
// 设置图片的宽、高
$this->width = ($ydataNum*$barWidth + $barSpace)*count($this->xdata) + $chartLeft;
$this->height = 300;
$this->image = imagecreatetruecolor($this->width ,$this->height); // 准备画布
$this->bgcolor = imagecolorallocate($this->image,255,255,255); // 图片的背景颜色 // 设置条形图的颜色
$color = array();
foreach($this->color as $col) {
$col = substr($col,1,strlen($col)-1);
$red = hexdec(substr($col,0,2));
$green = hexdec(substr($col,2,2));
$blue = hexdec(substr($col,4,2));
$color[] = imagecolorallocate($this->image ,$red, $green, $blue);
} // 设置线段的颜色、字体的颜色、字体的路径
$lineColor = imagecolorallocate($this->image ,0xcc,0xcc,0xcc);
$fontColor = imagecolorallocate($this->image, 0x95,0x8f,0x8f);
$fontPath = 'font/simsun.ttc'; imagefill($this->image,0,0,$this->bgcolor); // 绘画背景 // 绘画图的分短线与左右边线
for($i = 0; $i < 6; $i++ ) {
imageline($this->image,$chartLeft-10,$barY-$barHeightMulti*$max/5/$multi*$i,$this->width,$barY-$barHeightMulti*$max/5/$multi*$i,$lineColor);
imagestring($this->image,4,5,$barY-$barHeightMulti*$max/5/$multi*$i-8,floor($max/5*$i),$fontColor);
}
imageline($this->image,$chartLeft-10,30,$chartLeft-10,$barY,$lineColor);
imageline($this->image,$this->width-1,30,$this->width-1,$barY,$lineColor); // 绘画图的条形
foreach($this->ydata as $key => $val) {
if($ydataNum == 1) {
// 一个系列数据时
$barX = $chartLeft + 3 + ($barWidth+$barSpace)*$key;
imagefilledrectangle($this->image,$barX,$barY-$barHeightMulti*$val/$multi,$barX+$barWidth,$barY,$color[$key%count($this->color)]);
}elseif($ydataNum > 1) {
// 多个系列的数据时
$cbarSpace = $barSpace + $barWidth*($ydataNum-1);
foreach($val as $ckey => $cval) {
$barX = $chartLeft + 3 + $barWidth*$key + $ckey*($cbarSpace+$barWidth);
imagefilledrectangle($this->image,$barX,$barY-$barHeightMulti*$cval/$multi,$barX+$barWidth,$barY,$color[$key%count($this->color)]);
}
} } // 绘画条形图的x坐标的值
foreach($this->xdata as $key => $val) {
$barX = $chartLeft + ($ydataNum*$barWidth+$barSpace)*$key + $ydataNum*$barWidth/3;
imagettftext($this->image,10,-45,$barX,$barY+15,$fontColor,$fontPath,$this->xdata[$key]);
} // 绘画标题
$titleStart = ($this->width - 5.5*strlen($this->title))/2;
imagettftext($this->image,11,0,$titleStart,20,$fontColor,$fontPath,$this->title); // 输出图片
header("Content-Type:image/png");
imagepng ( $this->image );
} /*
* 私有方法,当数组为二元数组时,统计数组的长度
* Array arr 要做统计的数组
*/
private function arrayNum($arr) {
$num = 0;
if(is_array($arr)) {
$num++;
for($i = 0; $i < count($arr); $i++){
if(is_array($arr[$i])) {
$num = count($arr);
break;
}
}
}
return $num;
} /*
* 私有方法,计算数组的深度
* Array arr 数组
*/
private function arrayDepth($arr) {
$num = 0;
if(is_array($arr)) {
$num++;
for($i = 0; $i < count($arr); $i++){
if(is_array($arr[$i])) {
$num += $this->arrayDepth($arr[$i]);
break;
}
}
}
return $num;
} /*
* 私有方法,找到一组中的最大值
* Array arr 数字数组
*/
private function arrayMax($arr) {
$depth = $this->arrayDepth($arr);
$max = 0;
if($depth == 1) {
rsort($arr);
$max = $arr[0];
}elseif($depth > 1) {
foreach($arr as $val) {
if(is_array($val)) {
if($this->arrayMax($val) > $max) {
$max = $this->arrayMax($val);
}
}else{
if($val > $max){
$max = $val;
}
}
}
}
return $max;
} function arrayAver($arr) {
$aver = array();
foreach($arr as $val) {
if(is_array($val)) {
$aver = array_merge($aver,$val);
}else{
$aver[] = $val;
}
}
return array_sum($aver)/count($aver); }
// 析构函数
function __destruct(){
imagedestroy($this->image);
}
}
?> 这个类可以实现画一个系列的柱状图和多个系列的柱状图,如下:
aaarticlea/png;base64,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" alt="" />
一个系列的柱状图


多个系列的柱状图

PHP中利用GD实现的柱状图的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. [原创]MYSQL中利用外键实现级联删除和更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...

  3. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  4. springMVC中利用model在JSTL进行回填值

    1.ringMVC中利用model回填值 后台中,利用model返回值,如 model.addAttribute("MS_info" , MS_info); 前台回填值: text ...

  5. zk框架中利用map类型传值来创建window,并且传值

    @Command @NotifyChange("accList") public void clear(@BindingParam("id") String a ...

  6. php学习笔记:利用gd库生成图片,并实现随机验证码

    说明:一些基本的代码我都进行了注释,这里实现的验证码位数.需要用的字符串都可以再设置.有我的注释,大家应该很容易能看得懂. 基本思路: 1.用mt_rand()随机生成数字确定需要获取的字符串,对字符 ...

  7. ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)

    原文:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100) 对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是 ...

  8. 【转】asp.net中利用session对象传递、共享数据[session用法]

    来自:http://blog.unvs.cn/archives/session-transfer-method.html 下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值 ...

  9. SpingMVC中利用BindingResult将错误信息返回到页面中

    SpingMVC中利用BindingResult将错误信息返回到页面中. ActionFrom中: private String name; private String password; get( ...

随机推荐

  1. 我心中的核心组件(可插拔的AOP)~第四回 异常拦截器

    回到目录 之前说过有关拦截器的文章,第二回  缓存拦截器,事实上,在那讲里说的最多是AOP和缓存组件,对于拦截的概念并没有详细的说明,这一讲,不说AOP,主要说一下拦截器,拦截器Interceptio ...

  2. VS2012 easyui datagrid url访问之坑

    VS2012 easyui datagrid url访问之坑 url属性放的是地址的话 返回的json格式必须有 total 和 rows,如下: {"total":2," ...

  3. token防止表单重复提交

    出现表单重复提交的三种情况: 一.服务器响应缓慢,用户多次点击提交按钮. 二.提交成功后刷新页面. 三.提交成功后返回表单页面再次点击提交. package com.jalja.token; impo ...

  4. PHP实现RESTful风格的API实例(一)

    最近看了一些关于RESTful的资料,自己动手也写了一个RESTful实例,以下是源码 目录详情: restful/ Request.php 数据操作类 Response.php 输出类 index. ...

  5. 在Ubuntu搭建.NET Core环境

    Ubuntu16.04配置.net core环境   Ubuntu 16.04 desktop下载地址:http://www.ubuntu.com/desktop 本次是用vmware安装该系统.   ...

  6. ASP.NET MVC中使用FluentValidation验证实体

    1.FluentValidation介绍 FluentValidation是与ASP.NET DataAnnotataion Attribute验证实体不同的数据验证组件,提供了将实体与验证分离开来的 ...

  7. JS之模板技术(aui / artTemplate)

    artTemplate是个好东西啊,一个开源的js前端模板引擎,使用简单,渲染效率特别的高. 我经常使用这个技术来在前端动态生成新闻列表,排行榜,历史记录等需要在前端列表显示的信息. 下面是artTe ...

  8. Git-图文教程

    https://github.com/haveatry823/QSanguoshaAI/wiki/Git-%E5%9B%BE%E6%96%87%E6%95%99%E7%A8%8B http://www ...

  9. 【转载】经典SQL语句大全

    [原文地址]http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html 一.基础 1.说明:创建数据库CREATE DATABAS ...

  10. Primer – 支撑 GitHub 的 CSS 工具包和准则

    Primer 是一个 CSS 工具包,支撑着 GitHub 的前端设计.它的目的仅限于提供通用部件,为我们的开发者提供最大的灵活性,并保持 GitHub 的独特风格.它基于 SCSS 建成,可以通过 ...