О web-разработке
и даже немного больше...

Построение диаграммы с использованием GD библиотеки

ГистограммаНа практике встречаются задачи, в которых есть необходимость построения графического представления данных, позволяющие быстро оценить соотношение нескольких величин. Для этих целей используются диаграммы, которые представляют собой геометрические символьные изображения информации с применением различных приёмов техники визуализации.
В данном примере демонстрируется построение диаграммы на PHP, с использованием библиотеки GD.
GD (Graphics Library) — программная библиотека, для динамической работы с изображениями. Библиотека позволяет создавать изображения в форматах GIF, JPEG, PNG и WBMP.

Код:

<?php
// массив значений
$values = array("23","32","35","57","12",
				 "3","36","54","32","15",
				 "43","24","30");

// Определяем общее количество столбцов
$columns  = count($values);

// Ширина и высота конечного изображения
$width = 200;
$height = 100;

// Отступ между колонками
$padding = 5;

// Ширина одной колонки
$column_width = $width / $columns ;

// Переменные изображения
$im        = imagecreate($width,$height);
$gray      = imagecolorallocate ($im,0xcc,0xcc,0xcc);
$gray_lite = imagecolorallocate ($im,0xee,0xee,0xee);
$gray_dark = imagecolorallocate ($im,0x7f,0x7f,0x7f);
$white     = imagecolorallocate ($im,0xff,0xff,0xff);

// Фон
imagefilledrectangle($im,0,0,$width,$height,$white);

$maxv = 0;

// Вычисляем максимальное значение
for($i=0;$i<$columns;$i++)$maxv = max($values[$i],$maxv);

	// Строим диаграмму
	for($i=0;$i<$columns;$i++)
	{
		$column_height = ($height / 100) * (( $values[$i] / $maxv) *100);

		$x1 = $i*$column_width;
		$y1 = $height-$column_height;
		$x2 = (($i+1)*$column_width)-$padding;
		$y2 = $height;

		imagefilledrectangle($im,$x1,$y1,$x2,$y2,$gray);

		// Для 3D эффекта
		imageline($im,$x1,$y1,$x1,$y2,$gray_lite);
		imageline($im,$x1,$y2,$x2,$y2,$gray_lite);
		imageline($im,$x2,$y1,$x2,$y2,$gray_dark);
	}

// Отправляем PNG заголовок.
// При необходимости можно заменить на JPEG или GIF и т.д.
header ("Content-type: image/png");
imagepng($im);
?>

Значения переменных — параметров:
$values – массив значений величин столбцов гистограммы;
$width – ширина изображения на выходе;
$height – высота изображения на выходе;
$padding – отступ между колонками;

Пример построения 3D диаграммы

Попробуем построить 3D диаграмму, взяв за основу вышеуказанный пример.
Код:

<?php

// здесь в принципе всё так же,
// как и в предыдущем примере
$values = array("23","32","38","57","12",
                "4","36","54","32","15",
                "43","44","30");

$columns  = count($values);
$width = 200;
$height = 100;

$column_width = floor($width / $columns) ;

$padding = min(max($padding,1),$column_width);

$im = imagecreate($width,$height);

$r = 0xaf;
$g = 0xaf;
$b = 0xaf;

// переменные изображения
$gray      = imagecolorallocate ($im,$r,$g,$b);
$gray_lite = imagecolorallocate ($im,$r+40,$g+40,$b+40);
$gray_dark = imagecolorallocate ($im,$r-20,$g-20,$b-20);
$white     = imagecolorallocate ($im,0xff,0xff,0xff);
    
imagefilledrectangle($im,0,0,$width,$height,$white);

$maxv = 0;

// уменьшаем максимальную высоту, для нормальных пропорций
$max_height = $height - $column_width;

for($i=0;$i<$columns;$i++)$maxv = max($values[$i],$maxv);
        
for($i=0;$i<$columns;$i++)
{
    $column_height = ($max_height / 100) * (( $values[$i] / $maxv) *100);

    $x1 = $i*$column_width;
    $y1 = $height-$column_height;
    $x2 = (($i+1)*$column_width)-$padding;
    $y2 = $height;

// рисуем основные колонки
imagefilledrectangle($im,$x1,$y1,$x2,$y2,$gray);

// вычитаем смещение для эффекта 3D
$offset = ($column_width-$padding) / 2;

	// массив для верхней части
    $pt = array($x1,$y1,
                $x1+$offset,$y1-$offset,
                $x2+$offset,$y1-$offset,
                $x2,$y1);

// рисуем
imagefilledpolygon($im,$pt,4,$gray_lite);

	// боковые части
    $pt = array($x2,$y1,
                $x2+$offset,$y1-$offset,
                $x2+$offset,$y2-$offset,
                $x2,$y2);

// прорисовываем так же
imagefilledpolygon($im,$pt,4,$gray_dark);

}

// возвращаем изображение с помощью ImagePng или imagejpeg,
// как в примере указанном выше
?>

В результате получим такую диаграмму:
3D Диаграмма

Опубликован: 20.01.2013 г.

См. также:

Редакторы кода для PHP
Как просмотреть время загрузки страницы в PHP?
Генерация QR-кода в PHP
Загрузка файлов на сервер посредством Ajax
Импорт записей из Excel в WordPress
Парсинг XML в PHP
Установка IonCube на XAMPP
Создание PDF файлов в PHP

Комментарии

  1. mihail пишет:
    $column_height = ($height / 100) * (( $values[$i] / $maxv) *100);
    

    Доброго дня. тут деление на ноль!!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта