Круговая диаграмма средствами библиотеки GD

В случае, если необходимо отобразить процентное соотношение каких-либо параметров, не обойтись без круговой диаграммы.

Строить ее совсем не трудно, если знать о существовании функций библиотеки GD imagearc и imagefilledarc, которые рисуют дугу и закрашенный сектор соответственно.

В качестве параметров функции imagearc(int im, int cx, int cy, int w, int h, int s, int e, int col) нужно указать:

  • im - идентификатор области рисования;
  • cx, cy - координаты центра дуги;
  • w, h - ширину и высота дуги (для построения сектора круга они должны быть равны);
  • s, e - начальный и конечный углы дуги (в градусах, от 0 до 360);
  • col - цвет дуги.

Функция imagefilledarc() отличается от предыдущей лишь наличием дополнительного параметра style, который определяет способ заливки сектора. Этот параметр может принимать следующие значения:

  • IMG_ARC_PIE - обычный способ заливки, получается закрашенный сектор;
  • IMG_ARC_CHORD (IMG_ARC_CHORD и IMG_ARC_PIE взаимоисключающие параметры) - заливка по хорде, то есть получается закрашенный треугольник;
  • IMG_ARC_NOFILL - без заливки, получаем просто дугу;
  • IMG_ARC_EDGED - используется совместно с IMG_ARC_NOFILL и указывает, что конечный и начальный углы дуги должны быть соединены с центром.

Эти параметры можно указывать, используя оператор || (ИЛИ).

Теперь, когда у нас есть все необходимые знания, создадим скрипт круговой диаграммы в новом файле diagramma.php.

Для начала создадим функцию рисования одного сектора круга требуемого цвета с заданным центром, радиусом, начальным и конечным углами:

function drawSegment($x0,$y0,$radius,$begAngle,$endAngle,$color)
{
global $im,$x0,$y0,$black;
//рисуем сектор круга соответствующих размера и цвета
imagefilledarc($im, $x0, $y0, $radius*2, $radius*2,
    $begAngle, $endAngle,
    $color, IMG_ARC_PIE);
//рисуем окантовку черным цветом
//для выведенного ранее сектора
imagefilledarc($im, $x0, $y0, $radius*2, $radius*2,
    $begAngle, $endAngle,
    $black, IMG_ARC_EDGED | IMG_ARC_NOFILL);
}

Для обработки данных и построения диаграммы нам не обойтись без соответствующей функции, которой мы будем передавать массив данных, массив цветов, соответствующих каждому элементу массива данных, центр окружности и ее радиус:

function drawDiagram($dataArray,$colors,$x0,$y0,$radius)
{
global $im,$x0,$y0,$black;
//вычисляем количество элементов в массиве данных
$count=count($dataArray);
//получаем сумму всех элементов массива
$sumVal=array_sum($dataArray);
//начнем рисовать сектора с угла 0 градусов
$begAngle=0;
//вычисляем угол для отрисовки первого сектора
$endAngle=floor($begAngle+
(($dataArray[1]*100)/$sumVal)*360/100);
//рисуем сегмент, соответствующий
//величине первого элемента массива
drawSegment($x0,$y0,$radius,
$begAngle,$endAngle,$colors[1]);
//аналогично поступаем с остальными элементами массива,
//за исключением последнего
for($i=2;$i<$count;$i++)
{
    $begAngle=$endAngle;
    $endAngle=floor($begAngle+
        (($dataArray[$i]*100)/$sumVal)*360/100);
        drawSegment($x0,$y0,$radius,
        $begAngle,$endAngle,$colors[$i]);
}
//рисуем сегмент для последнего элемента массива
$begAngle=$endAngle;
$endAngle=360;
drawSegment($x0,$y0,$radius,
$begAngle,$endAngle,$colors[$count]);
}

Теперь создадим тестовую диаграмму, используя наши функции:

$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, 221, 221, 221);

// координаты центра окружности диаграммы
$x0=200; $y0=200;
// радиус диаграммы
$radius=100;
//заполняем массив данных и цветов для диаграммы
$dataArray[1]=2; $colors[1]=$red;
$dataArray[2]=6; $colors[2]=$blue;
$dataArray[3]=10; $colors[3]=$green;
//рисуем диаграмму
drawDiagram($dataArray,$colors,$x0,$y0,$radius);
ImagePNG($im);
imagedestroy($im);

Отображение графика в браузере:

<img src="diagramma.php">

Смотрите также: Создание линейного графика


.