php打造智能化的柱状图程序,用于报表等

php打造智能化的柱状图程序,用于报表等

<?php
/***
 * @project Bar Graph Program
 * @license GPL
 * @package
 * @file GrapBar.php
 * @date 2007-4-3
 * @version 1.0
 * @last modified 

 * 定义 柱状图(柱形图) 类
 *
 * 注意,使用前请确保字体路径存在并允许访问,如果出错,还要检查在php.ini配置中的open_basedir项,如果没此路径请添加,或在程序中设置包含
 *
 * 智能化的柱状图程序,用于报表等
 *
 ***/ 

define("DEFAULT_FONT_PATH", "c:/windows/fonts/simhei.ttf");
class SingleBar
{
 private $_x;
 private $_y;
 private $_h;
 public $_l = 50;
 private $_w = null;
 private $_srcPoints = array();
 private $_points = array(); 

 public function __construct($x, $y, $h, $l = 50, $w = null)
 {
 $this->_x = $x;
 $this->_y = $y;
 $this->_h = $h;
 $this->_l = $l;
 $this->_w = $w;
 $this->_srcPoints = $this->getSrcPoints();
 $this->_points = $this->getPoints();
 } 

 public function getSrcPoints()
 {
 return array(
  array($this->_x         , $this->_y),
  array($this->_x+$this->_l    , $this->_y),
  array($this->_x+(1.35*$this->_l), $this->_y-(0.35*$this->_l)),
  array($this->_x+(0.35*$this->_l), $this->_y-(0.35*$this->_l)),
  array($this->_x         , $this->_y+$this->_h),
  array($this->_x+$this->_l    , $this->_y+$this->_h),
  array($this->_x+(1.35*$this->_l), $this->_y+$this->_h-(0.35*$this->_l))
 );
 } 

 public function getPoints()
 {
 $points = array();
 foreach($this->_srcPoints as $key => $val)
 {
  $points[] = $val[0];
  $points[] = $val[1];
 }
 return $points;
 } 

 public function getTopPoints()
 {
 return array_slice($this->_points, 0, 8); //顶坐标
 } 

 public function getBelowPoints()
 {
 return array_merge(array_slice($this->_points, 0, 2), array_slice($this->_points, 8, 4), array_slice($this->_points, 2, 2)); //下坐标
 } 

 public function getRightSidePoints()
 {
 return array_merge(array_slice($this->_points, 2, 2), array_slice($this->_points, 10, 4), array_slice($this->_points, 4, 2)); //右侧坐标
 } 

 public function draw($image, $topColor, $belowColor, $sideColor, $borderColor = null, $type = 'LEFT')
 {
 if (is_null($borderColor))
 {
  $borderColor = 0xcccccc;
 } 

 $top_rgb = $this->getRGB($topColor);
 $below_rgb = $this->getRGB($belowColor);
 $side_rgb = $this->getRGB($sideColor);
 $top_color = imagecolorallocate($image, $top_rgb['R'], $top_rgb['G'], $top_rgb['B']);
 $below_color = imagecolorallocate($image, $below_rgb['R'], $below_rgb['G'], $below_rgb['B']);
 $side_color = imagecolorallocate($image, $side_rgb['R'], $side_rgb['G'], $side_rgb['B']); 

 imagefilledpolygon($image, $this->getTopPoints(), 4, $top_color); //画顶面
 imagepolygon($image, $this->getTopPoints(), 4, $borderColor); //画顶面边线 

 imagefilledpolygon($image, $this->getBelowPoints(), 4, $below_color); //画下面
 imagepolygon($image, $this->getBelowPoints(), 4, $borderColor); //画下面边线 

 if ($type == 'LEFT')
 {
  imagefilledpolygon($image, $this->getRightSidePoints(), 4, $side_color); //画右侧面
  imagepolygon($image, $this->getRightSidePoints(), 4, $borderColor); //画侧面边线
 }
 } 

 public function getRGB($color)
 {
 $ar = array();
 $color = hexdec($color);
 $ar['R'] = ($color>>16) & 0xff;
 $ar['G'] = ($color>>8) & 0xff;
 $ar['B'] = ($color) & 0xff;
 return $ar;
 }
} 

class Bar
{
 private $_W;
 private $_H;
 private $_bgColor = "ffffff";
 private $_barHeights = array();
 private $_barTexts = array();
 private $_barColors = array();
 public $_title;
 public $_paddingTop = 30;
 public $_paddingBottom = 100;
 public $_paddingLeft = 45;
 public $_paddingRight = 2;
 public $_barL = 50;
 public $image; 

 public function __construct($imgW, $imgH, $barHeights, $barTexts = null, $barColors = null)
 {
 $this->_W = $imgW;
 $this->_H = $imgH;
 $this->_barHeights = $barHeights;
 $this->_barTexts  = $barTexts;
 $this->_barColors = $barColors;
 $this->_paddingBottom = $this->resetPaddingBottom();
 $this->_H = $this->resetHeight();
 $this->image = imagecreatetruecolor($this->_W, $this->_H);
 } 

 public function stroke()
 {
 $this->drawBg();
 $this->drawBars();
 $this->drawTitle();
 $this->drawLables();
 ob_start();
 //header("Content-type: image/png");
 //imagepng($this->image);
 header("Content-type: " . image_type_to_mime_type(IMAGETYPE_JPEG));
    imagejpeg($this->image);
 imagedestroy($this->image);
 } 

 public function drawBg()
 {
 $img_w = $this->_W;
 $img_h = $this->_H;
 $paddingTop  = $this->_paddingTop;
 $paddingBottom = $this->_paddingBottom;
 $paddingLeft  = $this->_paddingLeft;
 $paddingRight = $this->_paddingRight;
 $rgb = $this->getRGB($this->_bgColor);
 $bg = imagecolorallocate($this->image,$rgb['R'], $rgb['G'], $rgb['B']);
 imagefilledrectangle($this->image, 0, 0, $img_w, $img_h, $bg);
 $side_bg = imagecolorallocatealpha($this->image, 220, 220, 220, 75);
 $side_bg2 = imagecolorallocate($this->image, 220, 220, 220);
 $border_color = imagecolorallocate($this->image, 190, 190, 190);
 $line_color = imagecolorallocate($this->image, 236, 236, 236);
 $dial_color = imagecolorallocate($this->image, 131, 131, 131); 

 $x1 = $paddingLeft;
 $y1 = $paddingTop;
 $x2 = $img_w - $paddingRight;
 $y2 = $img_h - $paddingBottom;
 imagerectangle($this->image, $x1, $y1, $x2, $y2, $border_color);
 imagefilledpolygon($this->image, array($x1-5,$y1+10, $x1-5,$y2+10, $x1,$y2, $x1,$y1), 4, $side_bg);
    imagepolygon($this->image, array($x1-5,$y1+10, $x1-5,$y2+10, $x1,$y2, $x1,$y1), 4, $border_color);
 imagefilledpolygon($this->image, array($x1-5,$y2+10, $x2-5,$y2+10, $x2,$y2, $x1,$y2), 4, $side_bg);
    imagepolygon($this->image, array($x1-5,$y2+10, $x2-5,$y2+10, $x2,$y2, $x1,$y2), 4, $border_color);
 imageline($this->image, $x1, $y2, $x2, $y2, $side_bg2); 

 $total_h = $img_h - $paddingTop - $paddingBottom;
 $every_h = $total_h/11;
 for($i=1; $i<=10; $i++)
 {
  imageline($this->image, $x1, $y1+($every_h*$i), $x2, $y1+($every_h*$i), $line_color); //画网线
 } 

 $max_h = max($this->_barHeights);
 for($i=1; $i<=10; $i++)
 {
  $value = $max_h - (($max_h/10)*($i-1));
  $value = strval($value);
  $str_w = strlen($value)*5;
  imageline($this->image, $x1-5-3, $y1+10+($every_h*$i), $x1-3+1, $y1+10+($every_h*$i), $dial_color); //画刻度线
  imagestring($this->image, 3, $x1-5-3-$str_w-1, $y1+10+($every_h*$i)-5, $value, 0x000000);
 }
 } 

 public function drawBars()
 {
 $counts = count($this->_barHeights);
 if (empty($this->_barColors))
 {
  $color = $this->setColor();
  $this->_barColors = array_slice($color, 0, $counts);
  //shuffle($this->_barColors);
 }
 $every_w = ($this->_W - $this->_paddingLeft - $this->_paddingRight)/$counts; //每一段宽
 $barL = $every_w;
 $barL = ($barL > $this->_barL*1.35+6) ? $this->_barL : $barL/1.35 - 6;
 $max_h = max($this->_barHeights);
 $ruler_h = $this->_H - $this->_paddingTop - $this->_paddingBottom; //标尺总高度
 $stander_h = $ruler_h - ($ruler_h/11); //标尺10等分的高度
 $i = 0;
 foreach ($this->_barHeights as $val)
 {
  $h = ($stander_h/$max_h)*$val;
  $x = $this->_paddingLeft + ($every_w*$i) + (($every_w - ($barL*1.35))/2);;
  $y = $this->_H - $this->_paddingBottom + 10 - $h;
  //$t_color = $this->_barColors[$i];
  $b_color = $this->_barColors[$i];
  //$s_color = $this->_barColors[$i]; 

  $rgb = $this->getRGB($this->_barColors[$i]);
  $R = $rgb['R'] * 0.7;
  $G = $rgb['G'] * 0.7;
  $B = $rgb['B'] * 0.7; 

  $c1 = $R > 0 ? dechex($R) : '00';
  $c2 = $G > 0 ? dechex($G) : '00';
  $c3 = $B > 0 ? dechex($B) : '00'; 

  $t_color = $b_color;
  $s_color = $c1. $c2 . $c3; 

  $SingleBar = new SingleBar($x, $y, $h, $barL);
  $SingleBar->draw($this->image, $t_color, $b_color, $s_color);
  $i++;
 }
 } 

 public function drawTitle()
 {
 if (empty($this->_title))
 {
  return;
 }
 $font = 5;
 $font_w = imagefontwidth($font);
 $len = strlen($this->_title);
 $x = ($this->_W + $this->_paddingLeft - $this->_paddingRight)/2;
 $x -= ($len*$font_w)/2;
 $y = ($this->_paddingTop - $font_w)/2 + 12;
 //imagestring($this->image, $font, $x, $y, $title, 0x000000);
 imagettftext($this->image, 12, 0, $x, $y, 0x000000, DEFAULT_FONT_PATH, $this->_title);
 } 

 public function drawLables()
 {
 $x1 = $this->_paddingLeft - 5;
 $y1 = $this->_H - $this->_paddingBottom + 20;
 $x2 = $this->_W - $this->_paddingRight;
 $y2 = $this->_H - 10;
 //imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, 0xffffff);
 imagerectangle($this->image, $x1, $y1, $x2, $y2, 0x000000);
 $space = 5;
 $x = $x1 + 3;
 $y = $y1 + 3;
 foreach ($this->_barTexts as $key => $val)
 {
  $color = $this->_barColors[$key];
  $rgb = $this->getRGB($color);
  $bg = imagecolorallocate($this->image,$rgb['R'], $rgb['G'], $rgb['B']);
  imagefilledrectangle($this->image, $x, $y, $x+12, $y+12, $bg); //绘12*12的矩形
     imagerectangle($this->image, $x, $y, $x+12, $y+12, 0x000000); //绘12*12的矩形框
  imagettftext($this->image, 12, 0, $x+12+3, $y+12, 0x000000, DEFAULT_FONT_PATH, $val);
  $x += 12 + $space + (strlen($val)*8) + $space;
  if ($x + (strlen($val)*8) >= $this->_W - $this->_paddingLeft - $this->_paddingRight)
  {
  $x = $x1 + 3;
  $y = $y + 12 + 3;
  }
 }
 } 

 public function resetPaddingBottom()
 {
 $ruler_w = $this->_W - $this->_paddingLeft - $this->_paddingRight;
 $label_w = $this->getLableTotalWidth();
 $lines = ceil($label_w / $ruler_w);
 $h = 12 * $lines + (3 * ($lines + 1)) + 30;
 return $h;
 } 

 public function resetHeight()
 {
 $padding_bottom = $this->resetPaddingBottom();
 if ($this->_H - $padding_bottom < 222)
 {
  return 222 + $padding_bottom;
 }
 return $this->_H;
 } 

 public function getLableTotalWidth()
 {
 $counts = count($this->_barTexts);
 $space = 5;
 $total_len = 0;
 foreach ($this->_barTexts as $val)
 {
  $total_len += strlen($val);
 } 

 $tx_w = ($total_len * 9) + ((12 + 3 + $space) * $counts);
 return $tx_w;
 } 

 public function setBg($color)
 {
 $this->_bgColor = $color;
 } 

 public function setTitle($title)
 {
 $this->_title = $title;
 } 

 public function setColor()
 {
 $ar = array('ff', '00', '33', '66', '99', 'cc');
 $color = array();
 for ($i=0; $i<6; $i++)
 {
  for ($j=0; $j<6; $j++)
  {
  for($k=0; $k<6; $k++)
  {
   $color[] = $ar[$i] . $ar[$j] . $ar[$k];
  }
  }
 } 

 $color2 = array();
 for ($i=1; $i<216; $i += 4)
 {
  $color2[] = $color[$i];
 } 

 return $color2;
 } 

 public function getRGB($color)
 {
 $ar = array();
 $color = hexdec($color);
 $ar['R'] = ($color>>16) & 0xff;
 $ar['G'] = ($color>>8) & 0xff;
 $ar['B'] = ($color) & 0xff;
 return $ar;
 }
} 

/***/
$bar = new Bar(500, 300, array(600, 300, 30, 500, 400, 250, 350, 360), array('AAAAA', 'BBBBB', 'CCCCC', 'DDDDD', 'EEEEEE', 'FFFFFF', 'GGGGGGG', 'HHHHHHHHH'));
$bar->setTitle('打造完美柱状图!');
$bar->stroke();
/***/
?>

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • 在PHP上显示JFreechart画的统计图方法

    如何在PHP上显示JFreechart?可能大部分都遇到这种情况,在JSP上的servlet能完全的显示出JFreechart画的统计图,但是和其他语言混合运用就不能显示了 我现在也遇到这个问题,想了半个小时终于弄明白了,实现的过程还是很简单的.(个人经验总结而已) 解决的思路: 1.先将JFreechart生成的图片保存在web 服务器上. 2.然后在JSP上用<img>标签显示 3.通过JS将JSP导入PHP页面 这样就实现了. 部分getColumnChart.jsp源码: 复制代码 代

  • PHP实现的曲线统计图表示例

    本文实例讲述了PHP实现的曲线统计图表.分享给大家供大家参考,具体如下: <?php /****************************** * 折线图生成函数 * youd * 090207-01 ******************************/ function line_stats_pic($value_y,$width,$high,$strong=1,$fix=0){ //y值处理函数 function line_point_y($num,$width,$high,

  • PHP 柱状图实现代码

    还有疑问的朋友可以加我QQ:460634320,大家一起讨论. 效果图: 复制代码 代码如下: <?php function createImage($data,$twidth,$tspace,$height){ header("Content-Type:image/jpeg"); $dataname = array(); $datavalue = array();//data里面的值 $i = 0; $j = 0; $k = 0; $num = sizeof($data); f

  • php GD绘制24小时柱状图

    80,250,430,134,35,60,233,90,263,225,120,59,151,677,340,221,550,300,229,97,230,123,133,87  一共24个数字 一个都不能少哦少了要出错 你可以修改函数判断一下 复制代码 代码如下: <?PHP     /*    24小时柱状图    作者:taokey    QQ:29611705    */ function h24($str){ $hour = explode(",",$str);    

  • php+highchats生成动态统计图

    复制代码 代码如下: series: [{                  type: 'pie',                  name: 'Browser share',                  data: [                      ['Firefox',   45.0],                      ['IE',       26.8],                      {                          na

  • JpGraph php柱状图使用介绍

    JpGraph简介 以前用PHP作图时必须要掌握复杂抽象的画图函数,或者借助一些网上下载的花柱形图.饼形图的类来实现.没有一个统一的chart类来实现图表的快速开发. 现在我们有了一个新的选择:JpGraph.专门提供图表的类库.它使得作图变成了一件非常简单的事情,你只需从数据库中取出相关数据,定义标题,图表类型,然后的事情就交给JpGraph,只需掌握为数不多的JpGraph内置函数(可以参照JpGraph附带例子学习),就可以画出非常炫目的图表! JpGraph安装方法: 1. 先到各大网站

  • PHP动态柱状图实现方法

    本文实例讲述了PHP动态柱状图实现方法.分享给大家供大家参考.具体分析如下: 1.需求 查询最近一个月的数据总条数和审核通过的条数,做成柱状图 2.实现代码: <!DOCTYPE html> <?php //计算上一个月的今天 function last_month_today($time){ $last_month_time = mktime(date("G", $time), date("i", $time),date("s"

  • PHP实现绘制3D扇形统计图及图片缩放实例

    1.利用php gd库的函数绘制3D扇形统计图 <?php header("content-type","text/html;charset=utf-8"); /*扇形统计图*/ $image = imagecreatetruecolor(100, 100); /*创建画布*/ /*设置画布需要的颜色*/ $white = imagecolorallocate($image,0xff,0xff,0xff); $gray = imagecolorallocate

  • php报表之jpgraph柱状图实例代码

    新手初识jpgraph肯定会遇到各种各样的问题,比如乱码什么的,本案例是jpgraph3.0.7制作,也经过本人的多次实验,解决乱码问题 复制代码 代码如下: <?php $datay=array(); //纵坐标数据 $datax=array(); //横坐标数据 foreach ($usernums as $key => $value){ $datay[] = $value; $datax[] = $userids[$key]; } require_once ('jpgraph-3.0.7

  • PHP制作3D扇形统计图以及对图片进行缩放操作实例

    1.利用php gd库的函数绘制3D扇形统计图 <?phpheader("content-type","text/html;charset=utf-8");/*扇形统计图*/$image = imagecreatetruecolor(100, 100);    /*创建画布*//*设置画布需要的颜色*/$white = imagecolorallocate($image,0xff,0xff,0xff);$gray = imagecolorallocate($i

  • PHP中使用GD库绘制折线图 折线统计图的绘制方法

    在PHP中,有一些简单的图像函数是可以直接使用的,但大多数要处理的图像,都需要在编译PHP时加上GD库.除了安装GD库之外,在PHP中还可能需要其他的库,这可以根据需要支持哪些图像格式而定.GD库可以在http://www.boutell.com/gd/免费下载,不同的GD版本支持的图像格式不完全一样,最新的GD库版本支持GIF.JPEG.PNG.WBMP.XBM等格式的图像文件,此外还支持一些如FreeType.Type 1等字体库.通过GD库中的函数可以完成各种点.线.几何图形.文本及颜色的

  • PHP实现动态柱状图改进版

    本文实例分析了PHP实现动态柱状图的改进版.分享给大家供大家参考.具体分析如下: 前面已经写过如果只做动态柱状图的情况,其实原理还是很简单的.因为昨天下午有新的需求,今天上午又修改了一番,并将数据根据编号不同分割显示在表中. 下面把代码粘出来,方便以后自己查看,思路只是一时的火花,今天我想出来这么做,不一定下次还能想得到,也不用费劲的去想,所以写成笔记是比较好的形式. <!DOCTYPE html> <?php // 计算上一个月的今天 function last_month_today

随机推荐