16
Май
2008
Круговая диаграма на PHP с использованием GD
posted in PHP |Часто данные приходится отображать в наглядном для пользователя виде, а именно с помощью диаграм. Одним из видов диаграм является круговая, где за каждый элемент отвечает свой сектор.
Напишем функцию, которая стоит такую диаграму используя библиотеку GD для PHP. В качестве входных параметров ассоциативный массив $ar ($ar[‘имя’]=данные;) и $title для заголовка диаграмы.
Сначала создадим саму функцию в piegraph.php:
<? function GraphPie($ar,$title) { // размеры диаграмы $diagramWidth=600; $diagramHeight=370; $legendOffset=50; // отсортируем по убыванию, сохраняя ключи arsort($ar); // наш скрипт будет объединять в один сектор все элементы, которые по отдельности не превыщают 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; // сколько % у нашего элемента $percents=round(100*($val/$sum),2); // цветной квадратик в легенде 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; $percents=round(100*($sumless1/$sum),2); // цветной квадратик в легенде 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"); // выводим картинку header("Content-type: image/png"); imagepng($image); imageInterlace($image, 1); imageColorTransparent($image, $colorBackgr); return; } ?>
Теперь протестируем скрипт. Создадим diagrampietest.php с данными о использовании веб-браузеров:
<? include("piegraph.php"); // скрипт с функцией GraphPie // наш массив данных $gr_val=array("Firefox"=>80,"Opera"=>50,"IE"=>150); $gr_val["Netscape"]=2; $gr_val["Konqueror"]=1; $gr_val["Mozilla"]=3; $gr_val["Safari"]=20; // постоение диаграмы GraphPie($gr_val,"Browsers"); ?>
Вы увидите следующую диаграму: