Написал свой первый класс для построения временной диаграммы/кривой (например для отображения статистики скачивания файла за последние дни). <?php class lz_graf { public $im;//Идентификатор изображения private $heigh;//Высота изображения private $width;//Ширина изображения private $punkt_x;//Выводить ли пунктирную горизонтальную линию? private $punkt_y;//Выводить ли пунктирную вертикальную линию? private $punkt_x_color;//Цвет пунктирной горизонтальной линии private $punkt_y_color;//Цвет пунктирной вертикальной линии private $razd_x_color;//Цвет оси х private $razd_y_color;//Цвет оси у private $razd_size;//Размер разделительной линии private $otstup_x;//Отступ от края изобр до графика по оси х private $otstup_y;//Отступ от края изобр до графика по оси у private $razd_x_text_size;//Размер текста разметки по оси х private $razd_y_text_size;//Размер текста разметки по оси у private $razd_x_text_color;//Цвет текста разметки по оси x private $razd_y_text_color;//Цвет текста разметки по оси у private $razd_x_text_otstup;//Отступ надписи от края графика по оси х private $razd_y_text_otstup;//Отступ надписи от края графика по оси у private $diagram_or_gr;//0 - вывод в виде диаграммы, 1-графика private $gr_color;//Цвет графика (ломаной кривой) private $y_name;//Массив элементов по ординате private $x_name;//Массив элементов по абциссе private $pryamoug_color;//Цвет прямоугольников (в виде диаграммы) private $pryamoug_gr;//Цвет границы прямоугольников (в виде диаграммы) private $bgc;//Цвет фона //Конструктор public function __construct($heigh=300, $width=502, $punkt_x=1, $punkt_y=1, $razd_size=3, $otstup_x=0.04, $otstup_y=0.09, $razd_x_text_size=3, $razd_y_text_size=3, $razd_x_text_otstup=0.2, $razd_y_text_otstup=1.015, $diagram_or_gr=0, $dannie=array('5','4','1','6','1','3','5','2','6','4','1','7', '5','6','4','2','3','6', '5','4','5','4','6','5','2', '3','6','4','1','5','7')) { $this->heigh=$heigh; $this->width=$width; $this->punkt_x=$punkt_x; $this->punkt_y=$punkt_y; $this->razd_size=$razd_size; $this->otstup_x=$otstup_x; $this->otstup_y=$otstup_y; $this->razd_x_text_size=$razd_x_text_size; $this->razd_y_text_size=$razd_y_text_size; $this->razd_x_text_otstup=$razd_x_text_otstup; $this->razd_y_text_otstup=$razd_y_text_otstup; $this->diagram_or_gr=$diagram_or_gr; $this->y_name=array('0', '1', '2','3', '4', '5', '6', '7', '8', '9', '10'); $this->x_name=0; $this->dannie=$dannie; $this->im= ImageCreateTrueColor($this->width, $this->heigh); $this->razd_x_text_otstup=$razd_x_text_otstup; $this->razd_y_text_otstup=$razd_y_text_otstup; $this->diagram_or_gr=$diagram_or_gr; $this->dannie=$this->mashtab(); //Масштабирование данных } //Деструктор public function __destruct() { ImageDestroy($this->im); } //Масштабирование данных (для наглядности) /*Если есть элемент превышающий 10 --уменьшаем все элементы на 10 --увеличиваем разметку на 10*/ private function mashtab (){ $flag=0; while ($flag == 0){ $flag=1; for ($i=0; $i<count($this->dannie); $i++){ if ($this->dannie[$i] > 10) { $flag=0; } } if ($flag == 0) { for ($k=0; $k<count($this->dannie); $k++){ settype($this->dannie[$k],'double'); $this->dannie[$k]=$this->dannie[$k]/10; settype($this->dannie[$k],'string'); } for ($k=0; $k<count($this->y_name); $k++){ settype($this->y_name[$k],'integer'); $this->y_name[$k]=$this->y_name[$k]*10; settype($this->y_name[$k],'string'); } //Увеличиваем отступ, чтобы разметка не наезжала на ось $this->otstup_x=$this->otstup_x*1.25; } } unset($this->x_name); for ($k=0; $k<count($this->dannie); $k++){ $this->x_name[$k]=$k+1; } return $this->dannie; } //Разметка оси у со штрихами private function sep_y_ () { $n=count($this->y_name); $x0=$this->width*$this->otstup_x; $y0=$this->heigh*$this->otstup_y; $x1=$this->width*$this->otstup_x; $y1=$this->heigh-$this->heigh*$this->otstup_y; $w=$this->width-($this->width*$this->otstup_x); $length=($y1-$y0)/($n-1); for ($i=0; $i<$n; $i++){ ImageLine($this->im, $x0, $y0, $x0+$this->razd_size, $y0, $this->razd_x_color); ImageLine($this->im, $x0, $y0, $x0-$this->razd_size, $y0, $this->razd_x_color); $style=array($this->punkt_x_color,IMG_COLOR_TRANSPARENT,IMG_COLOR_TRANSPARENT,IMG_COLOR_TRANSPARENT); imagesetstyle($this->im, $style); ImageLine($this->im, $x0, $y0, $w, $y0, IMG_COLOR_STYLED); $y0+=$length; } } //Разметка оси х без штрихов private function sep_y_lite_ () { $x0=$this->width*$this->otstup_x; $y0=$this->heigh*$this->otstup_y; $x1=$this->width*$this->otstup_x; $y1=$this->heigh-$this->heigh*$this->otstup_y; $n=count($this->y_name); $length=($y1-$y0)/($n-1); for ($i=0; $i<$n; $i++){ ImageLine($this->im, $x0, $y0, $x0+$this->razd_size, $y0, $this->razd_x_color); ImageLine($this->im, $x0, $y0, $x0-$this->razd_size, $y0, $this->razd_x_color); $y0+=$length; } } //Разметка оси х со штрихами private function sep_x_ () { $x0=$this->width*$this->otstup_x; $y0=$this->heigh-$this->heigh*$this->otstup_y; $x1=$this->width-$this->width*$this->otstup_x; $y1=$this->heigh-$this->heigh*$this->otstup_y; $m=count($this->x_name); $h=$this->heigh*$this->otstup_y; $length=($x1-$x0)/$m; for ($i=0; $i<$m-1; $i++){ $x0+=$length; ImageLine($this->im, $x0, $y0, $x0, $y0+$this->razd_size, $this->razd_y_color); ImageLine($this->im, $x0, $y0, $x0, $y0-$this->razd_size, $this->razd_y_color); $style=array($this->punkt_y_color,IMG_COLOR_TRANSPARENT,IMG_COLOR_TRANSPARENT,IMG_COLOR_TRANSPARENT); imagesetstyle($this->im,$style); ImageLine($this->im, $x0, $h, $x0, $y0, IMG_COLOR_STYLED); } } //Разметка оси х без штрихов private function sep_x_lite_ () { $x0=$this->width*$this->otstup_x; $y0=$this->heigh-$this->heigh*$this->otstup_y; $x1=$this->width-$this->width*$this->otstup_x; $y1=$this->heigh-$this->heigh*$this->otstup_y; $m=count($this->x_name); $length=($x1-$x0)/$m; for ($i=0; $i<$m-1; $i++){ $x0+=$length; ImageLine($this->im, $x0, $y0, $x0, $y0+$this->razd_size, $this->razd_y_color); ImageLine($this->im, $x0, $y0, $x0, $y0-$this->razd_size, $this->razd_y_color); } } //Вывод надписей разметки оси ординат private function sep_y_text_ (){ $x0=$this->width*$this->otstup_x; $y0=$this->heigh*$this->otstup_y; $x1=$this->width*$this->otstup_x; $y1=$this->heigh-$this->heigh*$this->otstup_y; $n=$this->y_name; $length=($y1-$y0)/(count($n)-1); $n=array_reverse($n); $y0-=$length; for ($i=0; $i<count($n); $i++){ $y0+=$length; ImageString($this->im, $this->razd_x_text_size, $x0*$this->razd_x_text_otstup, $y0-5, $n[$i], $this->razd_x_text_color); } } //Вывод надписей разметки оси х private function sep_x_text_ (){ $x0=$this->width*$this->otstup_x; $y0=$this->heigh-$this->heigh*$this->otstup_y; $x1=$this->width-$this->width*$this->otstup_x; $y1=$this->heigh-$this->heigh*$this->otstup_y; $m=$this->x_name; $length=(($x1-$x0)/count($m)); $flag=1; for ($i=0; $i<count($m); $i++){ $x0+=$length; if ($flag==1){ $flag=-1; ImageString($this->im, $this->razd_y_text_size, $x0-13, $y0*$this->razd_y_text_otstup, $m[$i], $this->razd_y_text_color); } else $flag=1; } } //Вычисление положения точки private function dlina ($m, $length,$y0){ $p=(round($m)*$length)+(($m-round($m))*$length); $p=$y0-$p; return $p; } //Построение прямоугольников (для диаграммы) private function pryamoug () { $x0=$this->width*$this->otstup_x; $y0=$this->heigh-$this->heigh*$this->otstup_y; $x1=$this->width-$this->width*$this->otstup_x; $y1=$this->heigh*$this->otstup_y; $m=$this->dannie; $n=$this->x_name; $length=(($x1-$x0)/(count($n))); $length_y=(($y0-$y1)/(count($this->y_name)-1)); $x0+=$length; imagesetthickness($this->im,1); for ($i=0; $i<count($m); $i++){ imagefilledrectangle($this->im,$x0,$y0,$x0-$length,$this->dlina($m[$i], $length_y, $y0),$this->pryamoug_color); imagerectangle($this->im,$x0,$y0,$x0-$length,$this->dlina($m[$i], $length_y, $y0),$this->pryamoug_gr); $x0+=$length; } } //Построение графика private function line (){ $x0=$this->width*$this->otstup_x; $y0=$this->heigh-$this->heigh*$this->otstup_y; $x1=$this->width-$this->width*$this->otstup_x; $y1=$this->heigh*$this->otstup_y; $m=$this->dannie; $length=(($x1-$x0)/(count($this->x_name))); $yy0=$y0; $style=array($this->gr_color); imagesetstyle($this->im,$style); $length_y=(($y0-$y1)/(count($this->y_name)-1)); $flag=1; for ($i=0; $i<count($m); $i++){ if ($flag==0){ imageline($this->im,$x0,$yy0,$x0+$length,$this->dlina($m[$i], $length_y, $y0),IMG_COLOR_STYLED); } else {$flag=0;} $yy0=$this->dlina($m[$i], $length_y, $y0); $x0+=$length; } } //Устанавливаем цвета public function set_color ($punkt_x_color, $punkt_y_color, $razd_x_color, $razd_y_color, $razd_x_text_color, $razd_y_text_color, $gr_color, $pryamoug_color, $pryamoug_gr, $bgc){ $this->punkt_x_color=$punkt_x_color; $this->punkt_y_color=$punkt_y_color; $this->razd_x_color=$razd_x_color; $this->razd_y_color=$razd_y_color; $this->razd_x_text_color=$razd_x_text_color; $this->razd_y_text_color=$razd_y_text_color; $this->gr_color=$gr_color; $this->pryamoug_color=$pryamoug_color; $this->pryamoug_gr=$pryamoug_gr; $this->bgc=$bgc; } //Отображение графика public function show (){ ImageFill($this->im, 0, 0, $this->bgc); imagesetthickness($this->im,2) ; ImageLine($this->im, $this->width*$this->otstup_x, $this->heigh-$this->heigh*$this->otstup_y, $this->width-$this->width*$this->otstup_x, $this->heigh-$this->heigh*$this->otstup_y, $this->razd_x_color); $otstup_xx=$this->otstup_x; if ($this->diagram_or_gr==0){ $this->pryamoug (); } else { $this->line(); } ImageLine($this->im, $this->width*$this->otstup_x, $this->heigh*$this->otstup_y, $this->width*$this->otstup_x, $this->heigh-$this->heigh*$this->otstup_y, $this->razd_y_color); if ($this->punkt_x==1) { $this->sep_y_(); } else { $this->sep_y_lite_(); } if ($this->punkt_y==1){ $this->sep_x_(); } else { $this->sep_x_lite_(); } $this->sep_y_text_(); $this->sep_x_text_(); Header ('Content-type: image/png'); ImagePng ($this->im); } } ?> <?php //Пример использования класса lz_graf require_once('lz_graf.php'); $dannie=array('50','34','89','77','27','20','60','43','53','88','11','12','25','45'); $a=new lz_graf(300, 502, 1, 1, 3, 0.04, 0.09, 3, 3, 0.2,1.015, 0,$dannie); /* Параметры: 300 - высота изображения 502 - ширина изображения 1 - выводить ли пунктирные линии по оси x (1-да, 0-нет) 1 - выводить ли пунктирные линии по оси x (1-да, 0-нет) 3 - Размер разделительной линии 0.04 - Отступ от края изобр до графика по оси х 0.09 - Отступ от края изобр до графика по оси y 3 - Размер текста разметки по оси х 3 - Размер текста разметки по оси y 0.2 - Отступ надписи от края графика по оси х 1.015 - Отступ надписи от края графика по оси y 0 - вывод в виде диаграммы или графика (ломанной кривой) (0-диаграмма, 1-кривая) $dannie - массив данных для построения */ $white=ImageColorAllocate ($a->im, 255, 255, 255); $blue=ImageColorAllocate ($a->im, 0, 0, 64); $red=ImageColorAllocate ($a->im, 250, 43, 5); $blue1=ImageColorAllocate ($a->im, 0, 64, 128); $a->set_color($white,$white,$white,$white,$white,$white,$white,$blue1,$white, $blue); $a->show(); ?> |