16
Май
2008
Круговая диаграма на PHP с использованием GD
posted in PHP |Часто данные приходится отображать в наглядном для пользователя виде, а именно с помощью диаграм. Одним из видов диаграм является круговая, где за каждый элемент отвечает свой сектор.
Напишем функцию, которая стоит такую диаграму используя библиотеку GD для PHP. В качестве входных параметров ассоциативный массив $ar ($ar['имя']=данные;) и $title для заголовка диаграмы.
Сначала создадим саму функцию в piegraph.php:
PHP:
-
<?
-
-
function GraphPie($ar,$title) {
-
// размеры диаграмы
-
$diagramWidth=600;
-
$diagramHeight=370;
-
$legendOffset=50;
-
-
// отсортируем по убыванию, сохраняя ключи
-
-
// наш скрипт будет объединять в один сектор все элементы, которые по отдельности не превыщают 1%
-
// Суммируем (можете использовать также функцию array_sum() )
-
$sum=0;
-
foreach ($ar as $name => $val) {
-
$sum+=$val;
-
}
-
-
//узнаем сколько меньше 1%
-
$sumless1=0; // и их сумму
-
$countless1=$countgreater1=0;
-
foreach ($ar as $name => $val) {
-
if ($val/$sum<0.01)
-
{ $sumless1+=$val;
-
$countless1++;
-
}
-
else $countgreater1++;
-
}
-
-
// создаем ихображение
-
$image = imageCreate($diagramWidth, $diagramHeight);
-
-
// цвета для фона и текста
-
$colorBackgr = imageColorAllocate($image, 220,220,220);
-
$colorText = imageColorAllocate($image, 0, 0, 0);
-
// цвета для наших секторов
-
$colors[0] = imagecolorallocate($image, 255, 0, 0);
-
$colors[1] = imagecolorallocate($image, 0, 151, 0);
-
$colors[2] = imagecolorallocate($image, 0, 0, 255);
-
$colors[3] = imagecolorallocate($image, 255, 255, 0);
-
$colors[4] = imagecolorallocate($image, 0, 255, 255);
-
$colors[5] = imagecolorallocate($image, 204, 0, 206);
-
$colors[6] = imagecolorallocate($image, 155, 105, 27);
-
$colors[7] = imagecolorallocate($image, 134,188,134);
-
$colors[8] = imagecolorallocate($image, 255,189,62);
-
$colors[9] = imagecolorallocate($image, 168,168,255);
-
$colors[10] = imagecolorallocate($image, 219,255,111);
-
$colors[11] = imagecolorallocate($image, 255,201,200);
-
$colors[12] = imagecolorallocate($image, 0,169,168);
-
$colors[13] = imagecolorallocate($image, 248,255,213);
-
$colors[14] = imagecolorallocate($image, 255,106,105);
-
$colors[15] = imagecolorallocate($image, 133,133,133);
-
$colors[16] = imagecolorallocate($image, 194,255,255);
-
$colors[17] = imagecolorallocate($image, 90,9,255);
-
$colors[18] = imagecolorallocate($image, 109,255,110);
-
$colors[19] = imagecolorallocate($image, 255,133,22);
-
-
// заполняем изображение цветом фона
-
imageFilledRectangle($image, 0, 0, $diagramWidth - 1, $diagramHeight - 1, $colorBackgr);
-
-
// начальный угол для сектора
-
$startAngle=0;
-
$perc=360/$sum; // соотвествие градусов 1 проценту
-
$i=0; // для вывода порядка элемента в легенде и выбора цвета
-
foreach ($ar as $name => $val) {
-
// если текущий элемент больше 1%
-
if ($val/$sum<0.01) // выходим из цикла
-
break;
-
-
// конечный угол сектора
-
$endAngle=$startAngle+$val*$perc;
-
// сколько % у нашего элемента
-
// цветной квадратик в легенде
-
imagefilledrectangle($image,285,$legendOffset+$i*15-9,295,$legendOffset+$i*15,$colors[$i]);
-
// текст легенды
-
imagettftext ($image, 10, 0, 300, $legendOffset+$i*15, $colorText, "arialcyr.ttf", ($i+1).". ".$name." (".$percents." %)");
-
// сектор
-
imagefilledarc($image, $diagramWidth/2-150, $diagramHeight/2, 200, 200, $startAngle, $endAngle, $colors[$i++], IMG_ARC_PIE);
-
// следующий сектор в качестве начального угла будет использовать конечный угол текущего
-
$startAngle=$endAngle;
-
}
-
-
// если есть элементы менее 1%
-
if ($countless1) {
-
$endAngle=360;
-
// цветной квадратик в легенде
-
imagefilledrectangle($image,285,$legendOffset+$i*15-9,295,$legendOffset+$i*15,$colors[$i]);
-
// текст в легенде
-
imagettftext ($image, 10, 0, 300, $legendOffset+$i*15, $colorText, "arialcyr.ttf", ($i+1).". "."Other"." (".$percents." %)");
-
// сектор "Other"
-
imagefilledarc($image, $diagramWidth/2-150, $diagramHeight/2, 200, 200, $startAngle, $endAngle, $colors[$i++], IMG_ARC_PIE);
-
}
-
-
-
// Заголовок диаграмы
-
imagettftext ($image, 14, 0, 10, 20, $colorText, "arialcyr.ttf", $title);
-
// некая копирайт информация
-
imagettftext ($image, 10, 0, 10, $diagramHeight-10, $colorText, "arialcyr.ttf", "www.aurorascorpio.com");
-
-
// выводим картинку
-
imagepng($image);
-
imageInterlace($image, 1);
-
imageColorTransparent($image, $colorBackgr);
-
-
return;
-
}
-
?>
Теперь протестируем скрипт. Создадим diagrampietest.php с данными о использовании веб-браузеров:
PHP:
-
<?
-
include("piegraph.php"); // скрипт с функцией GraphPie
-
// наш массив данных
-
$gr_val["Netscape"]=2;
-
$gr_val["Konqueror"]=1;
-
$gr_val["Mozilla"]=3;
-
$gr_val["Safari"]=20;
-
// постоение диаграмы
-
GraphPie($gr_val,"Browsers");
-
?>
Вы увидите следующую диаграму:
