Home >Backend Development >PHP Tutorial >How to create an intelligent histogram program in PHP

How to create an intelligent histogram program in PHP

墨辰丷
墨辰丷Original
2018-06-09 15:19:002005browse

This article mainly introduces the method of creating an intelligent histogram program in PHP. Interested friends can refer to it. I hope it will be helpful to everyone.

This article mainly introduces PHP to create an intelligent bar chart program for reports, etc. The details are as follows:

<?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 = &#39;LEFT&#39;) 
 { 
 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[&#39;R&#39;], $top_rgb[&#39;G&#39;], $top_rgb[&#39;B&#39;]); 
 $below_color = imagecolorallocate($image, $below_rgb[&#39;R&#39;], $below_rgb[&#39;G&#39;], $below_rgb[&#39;B&#39;]); 
 $side_color = imagecolorallocate($image, $side_rgb[&#39;R&#39;], $side_rgb[&#39;G&#39;], $side_rgb[&#39;B&#39;]); 
   
 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 == &#39;LEFT&#39;) 
 { 
  imagefilledpolygon($image, $this->getRightSidePoints(), 4, $side_color); //画右侧面 
  imagepolygon($image, $this->getRightSidePoints(), 4, $borderColor); //画侧面边线 
 }  
 } 
  
 public function getRGB($color) 
 { 
 $ar = array(); 
 $color = hexdec($color); 
 $ar[&#39;R&#39;] = ($color>>16) & 0xff; 
 $ar[&#39;G&#39;] = ($color>>8) & 0xff; 
 $ar[&#39;B&#39;] = ($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[&#39;R&#39;], $rgb[&#39;G&#39;], $rgb[&#39;B&#39;]); 
 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[&#39;R&#39;] * 0.7; 
  $G = $rgb[&#39;G&#39;] * 0.7; 
  $B = $rgb[&#39;B&#39;] * 0.7; 
   
  $c1 = $R > 0 ? dechex($R) : &#39;00&#39;; 
  $c2 = $G > 0 ? dechex($G) : &#39;00&#39;; 
  $c3 = $B > 0 ? dechex($B) : &#39;00&#39;; 
  
  $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[&#39;R&#39;], $rgb[&#39;G&#39;], $rgb[&#39;B&#39;]); 
  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(&#39;ff&#39;, &#39;00&#39;, &#39;33&#39;, &#39;66&#39;, &#39;99&#39;, &#39;cc&#39;); 
 $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[&#39;R&#39;] = ($color>>16) & 0xff; 
 $ar[&#39;G&#39;] = ($color>>8) & 0xff; 
 $ar[&#39;B&#39;] = ($color) & 0xff; 
 return $ar; 
 } 
} 
  
/***/ 
$bar = new Bar(500, 300, array(600, 300, 30, 500, 400, 250, 350, 360), array(&#39;AAAAA&#39;, &#39;BBBBB&#39;, &#39;CCCCC&#39;, &#39;DDDDD&#39;, &#39;EEEEEE&#39;, &#39;FFFFFF&#39;, &#39;GGGGGGG&#39;, &#39;HHHHHHHHH&#39;)); 
$bar->setTitle(&#39;打造完美柱状图!&#39;); 
$bar->stroke(); 
/***/ 
?>

Summary: The above is the entire content of this article , I hope it can be helpful to everyone’s study.

Related recommendations:

php method to implement FTP file transfer based on curl

php template Method to achieve refresh-free upload by combining with js upload plug-in

php method to implement grabbing Thunder VIP account based on collection class Snoopy

The above is the detailed content of How to create an intelligent histogram program in PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn