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();
/***/
?>
时间: 2024-10-13 11:27:51

php绘制柱状图的相关文章

canvas绘制柱状图和、绘制形状中心旋转

<!DOCTYPE html> <html ng-app=""> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <canvas id="cvs" width="400" height="300"

167天:canvas绘制柱状图

canvas绘制柱状图 1.HTML 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> 6 &l

使用matplotlib中的bar函数绘制柱状图

使用柱状图显示三日电影的票房信息 要显示的数据为2018年12月7日-9日四场电影的票房信息 四场电影分别为:无名之辈,狗十三,毒液:知名守卫者,憨豆特工3 2018年12月7日四场电影票房分别为:[991.94, 375.64, 200.48, 73.27] 2018年12月8日四场电影票房分别为:[1908.22, 547.61, 466.23, 193.8] 2018年12月9日四场电影票房分别为:[1532.87, 525.63, 332.35, 170.57] 本次绘图思路: 1.x轴

python 绘制柱状图

import matplotlib.pyplot as plt import numpy as np # 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80像素/每英寸 plt.figure(figsize=(8, 6), dpi=80) # 再创建一个规格为 1 x 1 的子图 plt.subplot(1, 1, 1) # 柱子总数 N = 6 # 包含每个柱子对应值的序列 values = (25, 32, 34, 20, 41, 50) # 包含每个柱子下标的序列 index =

14-canvas绘制柱状图

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>14-Canvas绘制柱状图</title> 6 <style> 7 *{ 8 margin: 0; 9 padding: 0; 10 } 11 canvas{ 12 display: block; 13 margin: 0

QT使用qcustomplot 绘制柱状图

今天因为需要在QT底下绘制一个柱状图,由于不想自己麻烦重载一个QWidget所以就在网上搜索到了QCustomPlot,按照这个项目主页的图像显示它是可以满足我的要求. 首先来看一下效果图(绘制风格,画刷,颜色都使用的默认的) 先将下载来的QCustomPlot.cpp QCustomPlot.h拷贝到你的工程里 首先在QtCreator中拖出一个QWidget,然后提升为QCustomPlot类. 假设该成员变量为widget. 柱状图我们需要两个数据,一个是每个柱的相应标签(QString)

使用HelloCharts绘制柱状图

首先下载依赖库 ,有现成的jar包:hellocharts-library-1.5.8.jar 在需要的布局中直接使用: <lecho.lib.hellocharts.view.ColumnChartView android:id="@+id/columnchart" android:layout_width="match_parent" android:layout_height="match_parent" /> 例如绘制一周的数

利用画布绘制柱状图

<!DOCTYPE html> <head> <meta charset="utf-8" /> <title>柱状图</title> <style>/*绘制画布的样式*/ canvas{ background-color: rgb(243,243,243); } </style> </head> <body> <canvas width="800px"

VUE中使用Echarts绘制柱状图

在main.js中引入echarts import echarts from 'echarts' Vue.prototype.$echarts = echarts 在相应的vue中导入echarts import echarts from 'echarts'; 实现柱状图显示 <div style="width: 100%;height: 50%;border:1px solid rgb(180,180,180);top: 0px" id="echartss"