Круговая диаграмма на php

Довольно часто в практике web-программирования встречаются задачи сбора статистики. Это разные голосования, распределения, сроки поставки и прочие числовые значения, которые нужно оценить в совокупности. Ну и очень часто для наглядного отображения полученных статистических данных применяют диаграммы. Как именно вы будете получать статистику в данной статье я описывать не буду - у всех свои задачи, остановлюсь подробно только на том, как нарисовать диаграмму с помощью бибилиотеки GD на php. Наиболее распространены 2 вида диаграмм - столбчатые и круговые. И если со столбчатыми все более/менее ясно - все рисуется при помощи прямоугольников (подробно об этом я уже писал в статье Функции рисования - библиотека GD), то в случае круговых диаграмм на php есть несколько тонкостей. О них и постараюсь подробно рассказать.

Круговая диаграмма на php

Круговая диаграмма на php строится с помощью функции
imagefilledarc ( resource $image, int $cx, int $cy, int $width, int $height, int $start, int $end, int $color, int $style ),
в составе ее параметров есть 2 значения ($start, $end) - начальный и конечный углы сектора. Вся окружность, как мы знаем - 360 градусов. 0 градусов - это 3 часа на привычном нам часовом циферблате. Первые 2 параметра ($cx, $cy) - координаты центра окружности/эллипса. Следующие 2 (width, height) ширина и высота, ну и $color - цвет, последний параметр, $style - стиль, для сплошной заливки исспользуем IMG_ARC_PIE.

Простейшая круговая диаграмма на php как видим, строится довольно просто. Привожу листинг кода:

$w = 300;
$h = 300;
$img = imagecreatetruecolor($w, $h);
imagesavealpha($img,true);    // альфа-канал для прозрачности
imagefill($img ,0,0,IMG_COLOR_TRANSPARENT); 
$varianti=array(10,25,20,45); // процентное соотношение вариантов значений круговой диаграммы
$cveta = array(imagecolorallocate($img, 255, 0, 0),imagecolorallocate($img, 0, 255, 0),imagecolorallocate($img, 0, 0, 255),imagecolorallocate($img, 127, 127, 127)); //массив цветов для круговой диаграммы
$k=0;
foreach ($varianti as $i) {
    imagefilledarc($img, $w/2, $h/2, $w-10, $h-80, $de, $de += round($i/100 * 360), $cveta[$k], IMG_ARC_PIE);    
    $ds = $de;
    $k++;
}
imagepng($img, 'pirog.png');
print '<h4>Круговая диаграмма</h4><img style="margin: 0px 0px" src="/pirog.png" />';

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

Пририсуем снизу прямоугольник-подложку:
imagefilledrectangle($img, 0, $h, $w, $h+80, imagecolorallocate($img, 244, 237, 22)); //желтый прямоугольник
Здесь думаю все понятно пока - ссылка на изображение, 2 пары координат углов (х1,у1,х2,у2), цвет
Сделаем вариантам названия и заготовим какой-либо шрифт:
$name_varianti=array("первый","второй","третий","четвертый"); // названия вариантов
$font = 'arial.ttf'; //можно взять к примеру в Windows\Fonts\
К нашему циклу добавим 2 строчки:
imagefilledrectangle($img, 5, $h+15*$k, 15, $h+10+15*$k, $cveta[$k]); //цветовые прямоугольнички
imagettftext($img, 10, 0, 20, $h+10+15*$k, imagecolorallocate($img, 0, 0, 0),$font, " - ".$name_varianti[$k]); //названия вариантов
1-я уже нам знакома, это прямоугольники, рисуем их на подложке, по левому краю, смещаясь вниз при шаге цикла на 15px
2-я строка выводит текст, параметры ее - ссылка на изображение, размер шрифта, угол наклона (0 - текст пишется слева направо), пара координат, указатель цвета, ранее заготовленый шрифт, ну и сам текст.
В итоге получим такой листинг:

$w = 300;
$h = 300;
$img = imagecreatetruecolor($w, $h+80);
imagesavealpha($img,true);    // альфа-канал для прозрачности
imagefill($img ,0,0,IMG_COLOR_TRANSPARENT); 
$varianti=array(10,25,20,45); // процентное соотношение вариантов значений круговой диаграммы
$cveta = array(imagecolorallocate($img, 255, 0, 0),imagecolorallocate($img, 0, 255, 0),imagecolorallocate($img, 0, 0, 255),imagecolorallocate($img, 127, 127, 127)); //массив цветов для круговой диаграммы
$k=0;
imagefilledrectangle($img, 0, $h, $w, $h+80, imagecolorallocate($img, 244, 237, 22)); //желтый прямоугольник
$name_varianti=array("первый","второй","третий","четвертый"); // названия вариантов
$font = 'arial.ttf'; //можно взять к примеру в Windows\Fonts\
 
foreach ($varianti as $i) {    
    imagefilledarc($img, $w/2, $h/2, $w-10, $h-80, $de, $de += round($i/100 * 360), $cveta[$k], IMG_ARC_PIE);    
    $ds = $de;
    imagefilledrectangle($img, 5, $h+15*$k, 15, $h+10+15*$k, $cveta[$k]); //цветовые прямоугольнички
    imagettftext($img, 10, 0, 20, $h+10+15*$k, imagecolorallocate($img, 0, 0, 0),$font, " - ".$name_varianti[$k]); //названия вариантов
    $k++;
}
 
imagepng($img, 'pirog.png')
print '<h4>Круговая диаграмма</h4><img style="margin: 0px 0px" src="/pirog.png" />';
Круговая диаграмма на php

По желанию можно конечно данную круговую диаграмму еще приукрасить, добавить "объема", используя те же, вышеописанные функции. Тут каждый додумает и "допилит" под себя, я же надеюсь что материал изложил понятно. Если есть вопросы - задавайте в комментариях.