Донецкий техникум промышленной автоматики

PHP. Малюємо кругові діаграми. - WiseREPORT

Частенько потрібно побудувати діаграму для оцінки тих чи інших кількісних параметрів. У цьому нам допоможе бібліотека GD і її PHP API. Нижченаведений клас будує простеньку кругову діаграму.

Приклад використання:

<? Php include ( 'dia.php'); $ Instance = new dia (); $ Data = array ( '3aad00' => 120, 'f10d0d' => 20, '280df1' => 70, 'dd0ee5' => 45, '000000' => 10); $ Instance-> generate ($ data);

Як видно з прикладу, передаємо методу generate асоціативний масив, де ключ - колір. Мінімальний кут - 1 градус, так що якщо якесь значення, перекладене в градуси, менше 1, воно ігнорується. Можна передавати як у відсотках, так і в довільних одиницях. Побудова відбувається із застосуванням пропорцій, де сума всіх елементів = 360 градусів.

З прикладу виходить кругова діаграма:


Частенько потрібно побудувати діаграму для оцінки тих чи інших кількісних параметрів

По кліку бачимо оригінальне зображення 500х500px. Звертаємо увагу, що воно вугласте. Тому, або зменшуємо його безпосередньо в браузері (параметрами width і height тега img), або ресайз, наприклад, як описано в цій статті із застосуванням методу resample. Доцільніше скористатися першим варіантом, щоб заощадити ресурси сервера.

Код класу:

<? Php class dia {/ * * @param array $ result * associative array WebColor => SomeNumber * @return picture * / public function generate ($ result = array ( '808080' => 33, '800080' => 33, '000000' => 33)) {$ sum = 0; / * Calculate sum of all elements * / foreach ($ result AS $ row) {$ sum + = $ row; } $ Image = imagecreatetruecolor (500, 500); imagefilledrectangle ($ image, 0, 0, 500, 500, imagecolorallocate ($ image, 255, 255, 255)); $ Old_grad = 0; foreach ($ result AS $ key => $ row) {/ * split array * / list ($ r, $ g, $ b) = $ this -> _ html2rgb ($ key); / * Calculate sectors in degrees * / $ grad = $ old_grad + round (($ row * 360) / $ sum); / * LibGD rounds degrees. * / If (round ($ old_grad) == round ($ grad)) continue; $ Color = imagecolorallocate ($ image, $ r, $ g, $ b); imagefilledarc ($ image, 250, 250, 500, 500, $ old_grad, $ grad, $ color, IMG_ARC_PIE); $ Old_grad = $ grad; } Header ( 'Content-type: image / gif'); imagegif ($ image); imagedestroy ($ image); } / * * @Param $ color * WebColor * * @return array * Color in RGB notation * / private function _html2rgb ($ color) {if ($ color [0] == '#') $ color = substr ($ color , 1); if (strlen ($ color) == 6) list ($ r, $ g, $ b) = str_split ($ color, 2); else return false; $ R = hexdec ($ r); $ G = hexdec ($ g); $ B = hexdec ($ b); return array ($ r, $ g, $ b); }}

root4root aka admin