Создание линейного графика на PHP с библиотекой GD2

Это часть статьи, посвященной работе с графологической библиотекой PHP, а именно с GD2.
Статья довольно распространенная и пространная. Я взял из не только кусок посвященный построению линейного графика.
Как есть скрипт у меня не заработал. В итоге я внес в тело скрипта переменные с цветами и поднял второй for в функции draw_grid на уровень первого.

Таким образом далее будет пример простого php-скрипта который генерирует линейные графики по заданным координатам.
И пример графика, который он генерирует.

<?php
header("Content-type: image/png");
function draw_axises($im_width,$im_heignt)
{
	global $im, $black, $l_grey, $x0, $y0, $maxX, $maxY;
	$x0=25.0; //начало оси координат по X
	$y0=20.0; //начало оси координат по Y
	$maxX=$im_width-$x0;  //максимальное значение оси координат по X в пикселах
	$maxY=$im_heignt-$y0; //максимальное значение оси координат по Y в пикселах
	imageline($im, $x0, $maxY, $maxX, $maxY, $black); //рисуем ось X
	imageline($im, $x0, $y0, $x0, $maxY, $black);     //рисуем ось Y
 
	//рисуем стрелку на оси X
	$xArrow[0]=$maxX-6; $xArrow[1]=$maxY-2;
	$xArrow[2]=$maxX; $xArrow[3]=$maxY;
	$xArrow[4]=$maxX-6; $xArrow[5]=$maxY+2;
	imagefilledpolygon($im, $xArrow, 3, $black);
	//рисуем стрелку на оси Y
	$yArrow[0]=$x0-2; $yArrow[1]=$y0+6;
	$yArrow[2]=$x0; $yArrow[3]=$y0;
	$yArrow[4]=$x0+2; $yArrow[5]=$y0+6;
	imagefilledpolygon($im, $yArrow, 3, $black);
}
function draw_grid($xStep,$yStep,$xCoef,$yCoef)
{
	global $im,$black,$l_grey,$x0,$y0,$maxX,$maxY;
	$xSteps=($maxX-$x0)/$xStep-1; //определяем количество шагов по оси X
	$ySteps=($maxY-$y0)/$yStep-1; //определяем количество шагов по оси Y
 
	for($i=1;$i<$xSteps+1;$i++)   //выводим сетку по оси X
		{
		imageline($im, $x0+$xStep*$i, $y0, $x0+$xStep*$i, $maxY-1, $l_grey);
		//при необходимости выводим значения линий сетки по оси X
		ImageString($im, 1, ($x0+$xStep*$i)-1, $maxY+2, $i*$xCoef, $black);
 
		}
	for($i=1;$i<$ySteps+1;$i++)
		{
		imageline($im, $x0+1, $maxY-$yStep*$i, $maxX, $maxY-$yStep*$i, $l_grey);
		//при необходимости выводим значения линий сетки по оси Y
		ImageString($im, 1, 0, ($maxY-$yStep*$i)-3, $i*$yCoef, $black);
		} 
}
function draw_data($data_x,$data_y,$points_count,$color)
{
	global $im,$x0,$y0,$maxY,$scaleX,$scaleY;
	for($i=1;$i<$points_count;$i++)
		{
		//рисуем линейный график по точкам из массивов данных
		imageline($im, $x0+$data_x[$i-1]*$scaleX, $maxY-$data_y[$i-1]*$scaleY, $x0+$data_x[$i]*$scaleX, $maxY-$data_y[$i]*$scaleY, $color);
		}
}
	//создаем рисунок шириной 500 и высотой 400 пикселов
	$im = @ImageCreate(500, 400);
	$white = ImageColorAllocate ($im, 255, 255, 255);
	$black = ImageColorAllocate ($im, 0, 0, 0);
	$red = ImageColorAllocate ($im, 255, 0, 0);
	$green = ImageColorAllocate ($im, 0, 255, 0);
	$blue = ImageColorAllocate ($im, 0, 0, 255);
	$yellow = ImageColorAllocate ($im, 255, 255, 0);
	$magenta = ImageColorAllocate ($im, 255, 0, 255);
	$cyan = ImageColorAllocate ($im, 0, 255, 255);
	$l_grey = ImageColorAllocate ($im, 200, 200, 200);
 
	draw_axises(500,400); //рисуем оси координат
	//задаем массивы данных графиков
	$x1[0]=1; $y1[0]=1;
	$x1[1]=2; $y1[1]=4;
	$x1[2]=3; $y1[2]=8;
	$x1[3]=4; $y1[3]=16;
	$x2[0]=1.5; $y2[0]=2;
	$x2[1]=2.5; $y2[1]=3;
	$x2[2]=3.5; $y2[2]=9;
	$x2[3]=4.5; $y2[3]=17;
 
	//объединяем данные из массивов данных для вычисления масштаба
	$x=array_merge($x1,$x2);
	$y=array_merge($y1,$y2);
	//получаем максимальные значения элементов для каждого массива
	$maxXVal=max($x);
	$maxYVal=max($y);
	//вычисляем масштаб преобразования данных в координаты рабочей области
	$scaleX=($maxX-$x0)/$maxXVal;
	$scaleY=($maxY-$y0)/$maxYVal;
	//задаем шаг для координатной сетки в пикселах
	$xStep=30;
	$yStep=30;
	//рисуем координатную сетку
	draw_grid($xStep,$yStep, round($xStep/$scaleX,1), round($yStep/$scaleY,1), true);
	draw_data($x1,$y1,20,$green); //рисуем первый график
	draw_data($x2,$y2,20,$blue); //рисуем второй график
	ImagePNG($im); //выводим рисунок
	imagedestroy($im); //освобождаем занимаемую рисунком память
?>

Кстати в качестве координат констант можно подать рандомные значения:

	$x1=Array(); 
	$y1=Array(); 
	$x2=Array(); 
	$y1=Array(); 
 
	for ($i=0;$i<20;$i++) 
        {
        $x1[]=rand(0,20);
        $x2[]=rand(0,20)/2;
        $y1[]=rand(0,20);
        $y2[]=rand(0,20)/2;
	}

Тогда на графиках будут "графики" похожие на некоторые дефолтные заставки WinXP.


Добавление комментария:

Вы можете использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">