Создание графиков с помощью pChart

logoВ то время, как Манчестер Юнайтед обыгрывал Челси в финале Лиги Чемпионов УЕФА, 21 мая 2008 года на сайте sourceforge.net была выложена первая из доступных версий библиотеки pChart 1.22. Этот день запомнился футбольным фанатам, но не запомнился php-программистам. Сегодня постараемся исправить это упущение и поговорим об одной из самых лучших библиотек для построения графиков pChart.

Библиотека
Загрузить библиотеку можно на страничке Downloads на официальном сайте. Текущая версия этой библиотеки имеет номер 1.27.

Распространяется эта библиотека под лицензией GNU General Public License, как написано в файле pChart/pChart.class самой библиотеки, любой из версий 1, 2 или 3 или любой другой поздней версии.

Установка
Для установки достаточно распаковать архив в текущую папку. Появится несколько файлов с примерами, а также папки Cache, Fonts, pChart, Sample и tmp. В документации на сайте разработчиков я не нашел требований к PHP. Я тестировал на версии 5.2.13 и могу сказать, что проблем для этой версии нет никаких. Кроме самого PHP нужно еще расширение для работы с GD.

Создание графика
Для создания графика возьмем данные российской фондовой биржи за месяц, которые использовались в предыдущей статье.

26.03 1519.87 1768.17
25.03 1515.04 1759.00
24.03 1514.58 1751.44
23.03 1524.96 1758.25
22.03 1525.59 1747.47
19.03 1544.71 1751.63
18.03 1558.80 1749.85
17.03 1563.46 1741.91
16.03 1536.79 1723.57
15.03 1514.40 1711.69
12.03 1534.68 1704.55
11.03 1504.04 1679.94
10.03 1501.40 1660.44
09.03 1502.70 1645.67
05.03 1508.21 1649.88
04.03 1470.41 1611.98
03.03 1460.20 1593.97
02.03 1445.62 1576.33
01.03 1429.77 1569.23
27.02 1410.85 1572.03
26.02 1390.25 1534.67

Сохранив эти данные в файле с именем rts.txt, напишем небольшую функцию, которая вытащит данные из файла.

Вот эта функция

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * @return array
 */
function getdata($file)
{
    if (file_exists($file)) {
 
        $lines = file($file);
        $data = array('date' => array(), 'rts' => array(),
            'rts2' => array());
        foreach ($lines as $line) {
            $tmp = explode(' ', trim($line));
            $data['date'][] = $tmp[0];
            $data['rts'][] = trim($tmp[1]);
            $data['rts2'][] = trim($tmp[2]);
        }
 
        return $data;
    } else {
        return false;
    }
}

Теперь напишем код, который выведет график в браузер.
pchart.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?php
error_reporting(0);
 
//подключаем файлы
include 'pChart/pChart/pData.class';
include 'pChart/pChart/pChart.class';
 
//получаем данные из файла
$d = getdata(dirname(__FILE__).DIRECTORY_SEPARATOR.'rts.txt');
$d['date'] = array_reverse($d['date']);
$d['rts'] = array_reverse($d['rts']);
$d['rts2'] = array_reverse($d['rts2']);
 
//создаем объект данных
$DataSet = new pData;
//добавлем точки
$DataSet->AddPoint($d['rts'],"Serie1");
$DataSet->AddPoint($d['rts2'],"Serie2");
$DataSet->AddPoint($d['date'],"Serie3");
//устанавливаем точки с датами
//на ось абсцисс
$DataSet->SetAbsciseLabelSerie("Serie3");
//помечаем данные как предназначеные для
//отображения
$DataSet->AddSerie("Serie1");
$DataSet->AddSerie("Serie2");
//устанавливаем имена
$DataSet->SetSerieName(mb_convert_encoding(
"Индекс РТС",'utf-8','windows-1251'), "Serie1");
$DataSet->SetSerieName(mb_convert_encoding(
"Индекс РТС2",'utf-8','windows-1251'), "Serie2");
 
//создаем график шириной в 1000 и высотой в 500 px
$graph = new pChart(1000,500);
//устанавливаем шрифт и размер шрифта
 $graph->setFontProperties("Fonts/tahoma.ttf",10);
 //координаты левой верхней вершины и правой нижней
 //вершины графика
 $graph->setGraphArea(85,30,950,400);
 //прорисовываем фон графика
 $graph->drawGraphArea(255,255,255,true);
 //устанавливаем данные для графиков
 $graph->drawScale($DataSet->GetData(),
         $DataSet->GetDataDescription(),
         SCALE_NORMAL,150,150,150,true,0,2,false,
         1);
 //рисуем сетку для графика
 $graph->drawGrid(4,true,230,230,230,50);
 
 //прорисовываем линейные графики
 $graph->drawLineGraph($DataSet->GetData(),
         $DataSet->GetDataDescription());
 
  //Пишем заголовок
 $graph->setFontProperties("pChart/Fonts/tahoma.ttf",10);
 $graph->drawTitle(480,22,
         mb_convert_encoding("Индексы РТС",
                 'utf-8','windows-1251'),
         50,50,50,-1,-1,true);
 
 //выводим в браузер
 $graph->Stroke();
 
/**
 * @return array
 */
function getdata($file)
{
    if (file_exists($file)) {
 
        $lines = file($file);
        $data = array('date' => array(), 'rts' => array(),
            'rts2' => array());
        foreach ($lines as $line) {
            $tmp = explode(' ', trim($line));
            $data['date'][] = $tmp[0];
            $data['rts'][] = trim($tmp[1]);
            $data['rts2'][] = trim($tmp[2]);
        }
 
        return $data;
    } else {
        return false;
    }
}
?>

В результате получим график индексов фондовой биржи

Не плохой график, правда?

Основная система построения графиков состоит из двух классов. Для хранения данных используется класс pData, для создания графика – класс pChart.

Для добавления точек в объект класса pData используется метод

1
2
void pData::AddPoint(mixed $Value, string $Serie= «Serie1»,
 string $Description = «»)

Все аргументы, кроме первого необязательные:

  • mixed $Value – данные, которые устанавливаются для точки. Если передан массив с данными, то устанавливаются сразу несколько точек;
  • string $Serie – название серии данных, к которой добавляется точка. По умолчанию добавляется к серии Serie1;
  • string $Description – описание точки. По умолчанию – пустое.

Для установки точек одной серии на ось абсцисс, используется метод

1
void pData::SetAbsciseLabelSerie(string $SerieName = «Name»)

Единственный аргумент не обязателен:

  • string $SerieName – наименование серии точек. По умолчанию имеет значение «Name».

Чтобы указать, какие из серий точек будут участвовать в построении графиков нужно вызвать метод

1
void pData::AddSerie(string $SerieName = «Serie1»)

Аргумент

  • string $SerieName – наименование серии точек. По умолчанию имеет значение «Serie1».

Если нужно добавить все серии точек, то можно вызвать метод

1
void pData::AddAllSeries()

Метод

1
2
void pData::SetSerieName(string $Name,
string $SerieName = «Serie1»)

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

  • string $Name – описание серии точек;
  • string $SerieName – имя серии точек, для которой устанавливается описание. Аргумент не обязателен.

Теперь рассмотрим класс pChart, который, собственно и рисует график. Конструктор этого класса

1
pChart pChart::pChart(int $XSize, int $YSize)

содержит два обязательных аргумента:

  • int $XSize – ширина создаваемого изображения;
  • int $YSize – высота создаваемого изображения.

Для установки свойств шрифтов используется метод

1
2
void pChart::setFontProperties(string $FontName,
int $FontSize)

У этого метода оба аргумента обязательны:

  • string $FontName – путь к файлу с TTF-шрифтом. В папке Fonts лежат TTF-шрифты. Из них кириллицу поддерживает только tahoma;
  • int $FontSize – размер шрифта.

Метод

1
void pChart::setGraphArea(int $X1, int Y1, int X2, int Y2)

устанавливает координаты верхнего левого угла и правого нижнего угла графика. Все аргументы обязательны:

  • int $X1 – Х-координата верхнего левого угла графика;
  • int $Y1 – Y-координата верхнего левого угла графика;
  • int $X2 – X-координата нижнего правого угла графика;
  • int $Y2 – Y-координата нижнего правого угла графика;

Для установки цвета фона графика используем метод

1
2
void pChart::drawGraphArea(int $R, int $G, int $B,
bool $Stripe = false)

Цвет устанавливается в цветовой системе RGB. Все аргументы, кроме последнего, обязательны:

  • int $R – число красной составляющей в цветовой модели;
  • int $G – число зеленой составляющей в цветовой модели;
  • int $B – число синей составляющей в цветовой модели;
  • bool $Stripe – если этот параметр установить в true, то фон графика будет заштрихован. По умолчанию установлен в false.

Метод

1
2
3
4
void pChart::drawScale(array $Data, array $DataDescription,
 int $ScaleMode, int $R, int $G, int $B, bool $DrawTicks=true,
int $Angle=0, int $Decimals=1, bool $WithMargin=false,
int $SkipLabels=1, bool $RightScale=false)

прочерчивает обе оси и записывает на них значения. Аргументов целая куча:

  • array $Data – данные для прорисовки осей. Можно получить из объекта класса pData (см. выше) следующим образом $pDataObj->GetData();
  • array $DataDescription – описания для осей. Можно получить из объекта класса pData посредством вызова метод $pDataObj->GetDataDescription();
  • int $ScaleMode – указывает вид шкалы для оси ординат. Может быть одной из констант:
    • SCALE_NORMAL – шкала устанавливается в значения между минимальным и максимальным значение серий;
    • SCALE_START0 – то же, что и предыдущее, но только минимальное устанавливается в 0;
    • SCALE_ADDALL – шкала вычисляется по совокупным значениям минимальных и максимальных значений серий;
    • SCALE_ADDALLSTART0 – то же, что и предыдущее, но минимальное значение устанавливается в 0;
  • int $R – число красной составляющей цвета оси в цветовой модели RGB;
  • int $G – число зеленой составляющей цвета оси в цветовой модели RGB;
  • int $B – число синей составляющей цвета оси в цветовой модели RGB;
  • bool $DrawTicks – если установлена в false, то будет отключена маркировка осей. Параметр не обязателен. По умолчанию установлен в true;
  • int $Angle – угол поворота маркировки оси. Параметр не обязателен. По умолчанию установлен в 0;
  • int $Decimals – число десятичных значений, которые необходимо сохранить на оси. Параметр не обязателен. По умолчанию установлен в 1;
  • bool $WithMargin – если установлен в false, то график будет начерчен на всю ширину. Если в true, то будет оставлен небольшой зазор. Параметр не обязателен. По умолчанию установлен в false;
  • int $SkipLabels – устанавливает число точек, через которое устанавливаются маркеры по оси абсцисс (оси Х). Параметр не обязателен. По умолчанию имеет значение 1;
  • bool $RightScale – если установлено в true, то ось ординат (ось Y) будет расположена справа, если в false – то слева. Параметр не обязателен. По умолчанию имеет значение false.

Метод

1
2
void pChart::drawGrid(int $LineWidth, bool $Mosaic=true,
int $R=220, int $G=220, int $B=220, int $Alpha=255)

прорисовывает сетку на фоне графика. Аргументы:

  • int $LineWidth – ширина линии сетки в пикселах;
  • bool $Mosaic – если установлено в true, то прорисовывается серая зона между двумя линиями. Параметр не обязателен. По умолчанию имеет значение true;
  • int $R – число красной составляющей цвета линии в цветовой модели RGB. Параметр не обязателен. По умолчанию имеет значение 220;
  • int $G - число зеленой составляющей цвета линии в цветовой модели RGB. Параметр не обязателен. По умолчанию имеет значение 220;
  • int $B - число синей составляющей цвета линии в цветовой модели RGB. Параметр не обязателен. По умолчанию имеет значение 220;
  • int $Alpha – коэффициент прозрачности. Параметр не обязателен. По умолчанию имеет значение 255.

С помощью метода

1
2
void pChart::drawLineGraph(array $Data,
array $DataDescription)

прорисовывается линейный график, используя все зарегистрированные серии точек. Аргументы:

  • array $Data – данные для прорисовки графиков. Можно получить из объекта класса pData (см. выше) следующим образом $pDataObj->GetData();
  • array $DataDescription – описания для грфиков. Можно получить из объекта класса pData посредством вызова метод $pDataObj->GetDataDescription();

Для прорисовки заголовка графика используется метод

1
2
3
void pChart::drawTitle(int $XPos, int $YPos, string $Value,
int $R, int $G, int $B, int $XPos2=-1, int $YPos=-1,
bool $Shadow=false)

Аргументы:

  • int $XPos – координата X начала заголовка;
  • int $YPos – координата Y начала заголовка;
  • string $Value – текст заголовка;
  • int $R – число красной составляющей цвета заголовка в цветовой модели RGB;
  • int $G – число зеленой составляющей цвета заголовка в цветовой модели RGB;
  • int $B – число синей составляющей цвета заголовка в цветовой модели RGB;
  • int $XPos2 – координата X конца заголовка. Параметр не обязателен. По умолчанию имеет значение -1 (отключен);
  • int $YPos2 – координата Y конца заголовка. Параметр не обязателен. По умолчанию имеет значение -1 (отключен);
  • bool $Shadow – если установлен в true, для заголовка прорисовывается тень. Параметр не обязателен. По умолчанию имеет значение false.

Метод

1
void pChart::Stroke()

выводит в браузер изображение.

Если нужно сохранить изображение в файл, то нужно использовать метод

1
void pChart::Render(string $FileName)

Аргумент:

  • string $FileName – имя файла, в который нужно сохранить изображение с графиком. Права для записи должны быть настроены корректно.

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

Читайте все статьи цикла

Популярность: 20%


Интересное из других блогов:

2leep.com

И не забывайте комментировать статью.

Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта

Отзывов: 10 на «Создание графиков с помощью pChart»

  1. Автор: scvorec, 19 апреля 2010 в 20:54

    использует Opera 10.51 Opera 10.51 на Windows XP Windows XP

    Спасибо за отличную статью. У меня назрел вопрос: а как запихнуть данные с таблицы в массив для графика, а то у меня чего-то не получается.
    Есть три колонки: value1, value2,value3. Первые две – это данные для линий, а третья – это подпись по Х.

    • Автор: web-junior, 19 апреля 2010 в 21:22

      использует Firefox 3.5.8 Firefox 3.5.8 на Windows XP Windows XP

      Вы имеете в виду из таблицы БД?
      С помощью функции mysql_fetch_assoc можно выбрать все данные из БД (вернет в виде ассоциативного массива). После чего можно добавлять данные с помощью метода
      pData::AddPoint
      а потом указать, какие данные будут надписями по Х с помощью метода
      pData::SetAbsciseLabelSerie

  2. Автор: lousx, 22 апреля 2010 в 12:37

    использует Firefox 3.6.3 Firefox 3.6.3 на Windows XP Windows XP

    В каком виде должны находится данные в файле rts.txt?
    Можно ли сделать, чтобы по оси Х выводилась дата. По умолчанию у меня выводятся значения от 0

    • Автор: web-junior, 22 апреля 2010 в 21:29

      использует Firefox 3.5.8 Firefox 3.5.8 на Windows XP Windows XP

      Про формат данных я писал в статье про построение графиков с помощью JpGraph.

      Этот файл имеет такую структуру:
      дата1 данные_для_графика_1_1 данные_для_графика2_1
      дата2 данные_для_графика_1_2 данные_для_графика2_2
      дата3 данные_для_графика_1_3 данные_для_графика2_3

      и так далее

  3. Автор: Dude, 5 июня 2010 в 20:08

    использует Firefox 3.5.9 Firefox 3.5.9 на Ubuntu 9.10 Ubuntu 9.10

    Возникает вот такая ошибка:
    Warning: Invalid argument supplied for foreach() in site.ru/web/include/chart/pData.class on line 139

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

    • Автор: web-junior, 10 июня 2010 в 11:02

      использует Firefox 3.5.9 Firefox 3.5.9 на Windows XP Windows XP

      в метод pData::AddPoint нужно передавать либо единичное значение точки либо массив со значениями точек.

  4. Автор: Алексей, 15 ноября 2011 в 17:41

    использует Google Chrome 15.0.874.120 Google Chrome 15.0.874.120 на Windows 7 Windows 7

    Ну почему я не пошел учиться и не продолжил заниматься програмрованием, вот почитал пост, уже 75% информации для меня не понятны, а может поднажать, учиться дальше?

    • Автор: web-junior, 15 ноября 2011 в 18:10

      использует Firefox 8.0 Firefox 8.0 на GNU/Linux x64 GNU/Linux x64

      Очень рекомендую. Программирование – очень перспективная область, которая востребована сейчас и будет цениться в ближайшем будущем.

  5. Автор: Oleh, 30 ноября 2011 в 15:03

    использует Google Chrome 15.0.874.121 Google Chrome 15.0.874.121 на Windows 7 Windows 7

    “Очень рекомендую. Программирование – очень перспективная область, которая востребована сейчас и будет цениться в ближайшем будущем” полностю согласен!

  6. Автор: Saffvas, 12 декабря 2011 в 10:28

    использует Opera 11.60 Opera 11.60 на Windows 7 Windows 7

    вы можете примерно показать как это будет в коде? Очень нужно, сделал функцию которая вытаскивает данные из базы а как теперь сделать чтобы они отображались на графике?

    С помощью функции mysql_fetch_assoc можно выбрать все данные из БД (вернет в виде ассоциативного массива). После чего можно добавлять данные с помощью метода
    pData::AddPoint
    а потом указать, какие данные будут надписями по Х с помощью метода
    pData::SetAbsciseLabelSerie

RSS-лента комментариев. Адрес для трекбека

Ваш отзыв

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Нажимая на кнопку "Добавить" вы принимаете правила комментирования