Рисуем график на PHP

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

Предыдущая статья на тему работы с графикой в РНР была посвящена созданию информеров и представлению табличных данны в виде изображения. PHP. Преобразование таблицы в картинку. Создание информеров.

Подробно рассказывать о пользе графического представления данных и о его наглядности я, пожалуй, не стану и сразу перейду к делу, то есть к коду:

  1.  
  2. //вспомогательная функция для определения цвета
  3. function ImageColor($im, $color_array)
  4. {
  5. $im,
  6. isset($color_array['r']) ? $color_array['r'] : 0,
  7. isset($color_array['g']) ? $color_array['g'] : 0,
  8. isset($color_array['b']) ? $color_array['b'] : 0
  9. );
  10. }
  11.  
  12. //определим массив с данными, которые необходимо вывести в виде графика.
  13. $data[] = '60.00';
  14. $data[] = '58.72';
  15. $data[] = '60.74';
  16. $data[] = '54.30';
  17. $data[] = '57.95';
  18. $data[] = '61.47';
  19. $data[] = '63.78';
  20. $data[] = '56.07';
  21. $data[] = '52.67';
  22. $data[] = '47.07';
  23. $data[] = '45.26';
  24. $data[] = '47.24';
  25.  
  26. //параметры изображения
  27. $width = 500; //ширина
  28. $height = 300; //высота
  29. $padding = 20; //отступ от края
  30. $step = 2; //шаг координатной сетки
  31.  
  32. //создаем изображение
  33. $im = @ImageCreate ($width, $height)
  34. or die ("Cannot Initialize new GD image stream");
  35.  
  36. //задаем цвета, которые будут использоваться при отображении картинки
  37. $bgcolor = ImageColor($im, array('r'=>255, 'g'=>255, 'b'=>255));
  38. $color = ImageColor($im, array('b'=>175));
  39. $green = ImageColor($im, array('g'=>175));
  40. $gray = ImageColor($im, array('r'=>175, 'g'=>175, 'b'=>175));
  41.  
  42. //определяем область отображения графика
  43. $gwidth = $width - 2 * $padding;
  44. $gheight = $height - 2 * $padding;
  45.  
  46. //вычисляем минимальное и максимальное значение
  47. $min = min($data);
  48. $min = floor($min/$step) * $step;
  49. $max = max($data);
  50. $max = ceil($max/$step) * $step;
  51.  
  52. //рисуем сетку значений
  53. for($i = $min; $i < $max + $step; $i += $step)
  54. {
  55. $y = $gheight - ($i - $min) * ($gheight) / ($max - $min) + $padding;
  56. ImageLine($im, $padding, $y, $gwidth + $padding, $y, $gray);
  57. ImageTTFText($im, 8, 0, $padding + 1, $y - 1, $gray, "verdana", $i);
  58. }
  59.  
  60. //отображение графика
  61. $cnt = count($data);
  62. $x2 = $padding;
  63. $i = 0;
  64.  
  65. //стоит отметить, что начало координат для картинки находится
  66. //в левом верхнем углу, что определяет формулу вычисления координаты y
  67. $y2 = $gheight - ($data[$i] - $min) * ($gheight) / ($max - $min) + $padding;
  68.  
  69. for($i = 1; $i < $cnt; $i++)
  70. {
  71. $x1 = $x2;
  72. $x2 = $x1 + (($gwidth) / ($cnt - 1));
  73. $y1 = $y2;
  74. $y2 = $gheight - ($data[$i] - $min) * ($gheight) / ($max - $min) + $padding;
  75.  
  76. //Рисуются две линии, чтобы сделать график более заметным
  77. ImageLine($im, $x1, $y1, $x2, $y2, $color);
  78. ImageLine($im, $x1 + 1, $y1, $x2 + 1, $y2, $color);
  79. }
  80.  
  81. //Отдаем полученный график браузеру, меняя заголовок файла
  82. header ("Content-type: image/png");
  83. ImagePng ($im);
  84.  
  85.  

Результатом работы скрипта по созданию графика будет следующее изображение.

Кстати, на графике изображены мои "успехи" при игре в онлайн покер

Читайте в блоге

Установка собственного OpenID сервера phpMyID
PHP. Преобразование таблицы в картинку. Создание информеров.
MFC. Использование HTML-интерфейса.
Полезные ссылки
Oracle. Преобразование даты в unix timestamp

Комментарии:

Дятел @ 11.05.2010 17:55

вот здесь тож ниче график построили
http://prootime.ru/css-graph
Izer0 @ 23.03.2011 00:56

Спасибо, это то что я долго искал
kuzroman @ 24.04.2011 00:02

Спасибо автор. Ваш пример очень помог в освоении библиотеки GD!
А главное в решинии конкретной задачи!
максим @ 08.11.2011 16:29

к сожалению код графика не рабочий:(((
Владимир Рыбаков @ 08.11.2011 21:32

>> к сожалению код графика не рабочий:(((

Вот это новость. Такое ощущение что десятока графиков на моих сайтах просто не существует, потому что они созданы неработающим кодом. Может втаря половина моей шизофренической личноси реисует эх в MS Paint и именно поэтому я не высыпаюсь.

Максим, если напишите что же именно не работает, то помогу разобраться.
kuzroman @ 08.11.2011 21:38

Доброго дня Владимир. Проверьте работу smtp. Письма о добавлении коментария ко мне приходят вот в таком формате: "??? ??? ???????. ????? ???????? ??? ???????? ???????? ?? ???? ??????"
Я было подумал что спам.
Советую использовать class.phpmaile для этой работы.
Почту открываю через оперу, в web интерфейсе mail.ru
Alex @ 16.11.2011 00:41

Как изменить параметры графика если используется <img src='graf.php'>
Владимир Рыбаков @ 16.11.2011 09:01

Для передачи параметров я вижу всего 2 варианта:

1. традиционного передать их в виде параметров запроса get - graf.php?p1=val1&p2=val2

2. поместить параметры в имя скрипта, и извлечь их в graf.php для запуска на graf.php в этом случае надо использовать .htaccess
Alex @ 16.11.2011 15:26

На основе метода Get, конечно можно, но вопрос в другом, не обрежет ли его. На разных хостах длина строки может меняться, и не факт, что все парамтры отрисовки пройдут.
Если возможность другим способом или POST, как реализовать.
Владимир Рыбаков @ 16.11.2011 16:00

По стандарту длина запроса чуть меньше двух килобайт. Мне кажется что этого должно хватить.

Я не сталкивался со случаями когда сервер режет запрос.

Можно хранить набор параматров на сервере и в запросе передавать только идентификатор этого набора. Но для того чтобы посоветовать что-то конкретное надо хотябы примерно представлять задачу.
Alex @ 18.11.2011 00:24

Каким способом хранить,
интересны варианты.
kuzroman @ 18.11.2011 00:39

Alex читай матчасть.
Все что здесь описано, является библиотекой GD.
Сохраняй библиотечной функцией:

ImagePng ($im,"img/stat.png");//сохраняем в файл
максим @ 18.11.2011 00:59

взял ваш скрипт попробовал. поместил содержимое в файл php? сделал ссылку нас сайте. ничего не появляется, пустая страница. подумал мой домашний хост глючит, перене на платный. та же беда, что не так делаю подскажите
Владимир Рыбаков @ 18.11.2011 10:42

Максим, причины могут быть самые разные и для того чтобы понять, что именно случилось надо включить отображение ошибок.

Вот лишь некоторые варианты

1. Отсутствует файл со шрифтом (в 58 строке меняем verdana на verdana.ttf и в корневую папку сайта кладем файл verdana.ttf, который предварительно находим в системной директории windows)

2. Не подключена библиотека GD. Чтобы убедиться в ее наличии достаточно посмотреть что выводит функция phpinfo()

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

Я сегодня тоже попробовал скопировать этот скрипт прямо со страницы и запустить его. Для того чтобы он заработал мне пришлось добавить файл со шрифтом.
максим @ 18.11.2011 11:05

первый вариант сделал . результат тот же.
второй вариант, надо узнавать у хостера . подскажите как вывести результат функции phpinfo() куда его поместить?
тертий вопрос .никаких выводов нет. пустая страница
Alex @ 18.11.2011 12:11

kuzroman @ 18.11.2011 00:39

Речь идет о передаче данных в файл и, как вариант, передачи их через сервер.
Вариант передачи через сервер не очень то и хотелось.
как передать массив даннных если метод get не подходит.
Владимир Рыбаков @ 22.11.2011 10:15

Максим, попробуйте включить отображение ошибок с помощью ini_set('display_errors', 1); в начале скрипта и посмотреть, что же действительно не работает в скрипте.

Alex, выриантов всего 3: GET; параметры в имени файла; данные на сервере, ассоциированные с именем файла.

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

Кроме-того использование метода с хранением параметров на сервере позволяет легко использовать кеш, что существенно снижает нагрузку на сервер.
максим @ 22.11.2011 12:08

ini_set('display_errors', 1); вставил в начале скрипта. в файл php. ничего все также пустая страница
Юрий @ 08.04.2012 03:11

Спасибо, после похода по различным способам лучше доработать и сделать библиотекой

Войдите на сайт, чтобы оставить комментарий