Hello,
I've written a script that has to show a bar chart with horizontal line of the name of companies en vertical line of amount of money that each company has payed. But it doesn't show a good chart. I've checked it en think it have to work well. Could you check it, and tell me where the error is, please?
Thanks,
<?php
header("Content-type: image/png");
class simpelbar{
private $margin=20; //The margin around of chart
private $marginverticalline=20; //place of vertical line
private $marginhorizentalline=40;//place of horizontal line
private $barmargin=10; //distance between two cells
private $inputwidth; //inserted width
private $inputheight; //inserted height
private $cells=array(); //array for the companies information
private $font="luxisri.ttf"; //font
function __construct($width,$height){
$this->inputwidth=$width;
$this->inputheight=$height;
}
function addbar($company,$money){
$this->cells[$company]=$money;
}
private function fontadjust($widthbar){
$fontsize=$widthbar;
foreach($this->cells as $key=>$val){
while(true){
$textsize=imageTTFbbox($fontsize,0,$this->font,$key);
if(abs($textsize[2])<$widthbar){
break;
}
$fontsize--;
}
}
return $fontsize;
}
function draw(){
$realwidth=$this->inputwidth-$this->margin*2; //the width of image
$realheight=$this->inputheight-$this->margin*2; //the height of image
$ystarthorizentalline=$realheight-$this->marginhorizentalline; // the begging y-point of horizontal line
$xendhorizentalline=$realwidth-$this->margin; //the end x-point of horizontal line
$max=max($this->cells); //the maximum amount of the money
$totalbars=count($this->cells); //total cells of the chart
$verticallinelong=$ystarthorizentalline-$this->margin; //the height of the vertical line
$widthbar=(int)(($realwidth-(2*$this->margin)-($this->barmargin*($totalbars+1)))/$totalbars); //the width of a cell
$text_size=$this->fontadjust($widthbar); //the text size
$image=imagecreate($realwidth,$realheight);
$red=imagecolorallocate($image,255,0,0);
$blue=imagecolorallocate($image,0,0,255);
$black=imagecolorallocate($image,0,0,0);
imageline($image, $this->margin,$ystarthorizentalline,$this->margin,$this->margin,$black);
imageline($image,$this->margin,$ystarthorizentalline,$xendhorizentalline,$ystarthorizentalline,$black);
$xbar=$this->margin+$this->barmargin; //the x-point of the first cell
foreach($this->cells as $key=>$val){
$ybar=$ystarthorizentalline-(int)($val/$max*$verticallinelong); // the y-point of first cell
$nextxbar=$xbar+$widthbar;// the second x-point of the cell
$nextybar=$this->marginhorizentalline;// the second y-point of the cell
imagefilledrectangle($image,$xbar,$ybar,$nextxbar,$nextybar,$blue);
$box=imageTTFbbox($text_size,0,$this->font,$key);
$xstartfont=$xbar+(int)(($widthbar-abs($box[2]))/2); //the begging of the text under the cells
imageTTFtext($image,35,0,$xstartfont,$realheight-5,$black,$this->font,$key);
$xbar=$nextxbar+$this->barmargin;//counting of the x-point of the next cell
}
imagepng($image);
}
}
$test=new simpelbar(400,300);
$test->addbar("Shell",300);
$test->addbar("Philips",200);
$test->addbar("CCC",400);
$test->draw();
?>