Исследование Perl модулей, часть 2: Рисуем диаграммы с использованием GD::Graph
Введение
Если вы читали мою предыдущую статью про GD, то могли подумать, что создавать диаграммы и графики с помощью GD будет не слишком удобно. По-видимому эта же мысль пришла в голову Мартину Вербруггену (Martien Verbruggen), который разработал модуль GD::Graph заточенный как раз под подобные задачи. С его помощью можно создавать гистограммы, линейные, круговые, и прочие диаграммы. Этот модель может оказаться очень полезным при обработке статистики загруженности сети, посещения сайта, ну и прочих подобных задачах.
В этой статье я опишу общие принципы использования модуля и продемонстрирую их несколькими примерами.
Типичное использование GD::Graph
Perl скрипт с использованием GD::Graph как правило состоит из следующих вещей:
- Подготовка данных в виде массива массивом
- Выбор типа диаграммы. Например следующим образом
$mygraph = GD::Graph::chart->new($width, $height);
где тип жиаграммы может быть задан как bars, lines, points, linespoints,
mixed or pie. Пример для гистограммы:
$mygraph = GD::Graph::bars->new($width, $height);
- Задание опций и меток для диаграммы, например таких как 'title', 'x-label', и т.п. Так же можно задавать опции, характерные для отдельных видов диаграмм.
- Отображение диаграммы, с помощью использования метода plot
$myimage = $mygraph->plot(\@data);
-
Ну и наконец можно сохранить полученное изображение в файл аналогично тому, как это описывалось в предыдущей статье.
Пристой пример
Нарисуем простой график. Для этого мы напишем CGI скрипт, выводящий изображение на вебстраницу.
#!/usr/local/bin/perl -w
use CGI ':standard';
use GD::Graph::bars;
use strict;
# Подготовка данных, на основе которых будет строиться график.
my @data = (["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"],
[23, 5, 2, 20, 11, 33, 7, 31, 77, 18, 65, 52]);
my $mygraph = GD::Graph::bars->new(500, 300);
$mygraph->set(
x_label => 'Month',
y_label => 'Number of Hits',
title => 'Number of Hits in Each Month in 2002',
) or warn $mygraph->error;
my $myimage = $mygraph->plot(\@data) or die $mygraph->error;
print "Content-type: image/png\n\n";
print $myimage->png;
На результат работы программы можно взглянуть здесь
Код приграммы говорит сам за себя. @data является массивом массивов. Первый массив это точки на оси X, а второй - данные, привязанные к этим точкам.
Настройка опций
Как вы видите, мы нарисовали чрезвычайно простой график. Мы можем сделать его посимпатичнее подкрутив некоторые свойства. Диаграммы разного типа обладают некоторым набором общих свойств, но есть так же и свойства, характерные для каждого типа диаграмм.
Свойства могут быть заданы при создании диаграммы
$mygraph->set(attrib1 => value1, attrib2 => value2, ...);
Напишем скрипт с легендами, сеткой, и еще несколькими опциями
#!/usr/local/bin/perl -w
use CGI ':standard';
use GD::Graph::bars;
use strict;
# Заносим данные
my @data = (['Fall 01', 'Spr 01', 'Fall 02', 'Spr 02' ],
[80, 90, 85, 75],
[76, 55, 75, 95],
[66, 58, 92, 83]);
my $mygraph = GD::Graph::bars->new(500, 300);
$mygraph->set(
x_label => 'Semester',
y_label => 'Marks',
title => 'Grade report for a student',
# Draw bars with width 3 pixels (не ручаюсь за точность, оставил без перевода. А.Ч.)
bar_width => 3,
# Sepearte the bars with 4 pixels (не ручаюсь за точность, оставил без перевода. А.Ч.)
bar_spacing => 4,
# Показывать сетку
long_ticks => 1,
# Показывать значения над столбиками
show_values => 1,
) or warn $mygraph->error;
$mygraph->set_legend_font(GD::gdMediumBoldFont);
$mygraph->set_legend('Exam 1', 'Exam 2', 'Exam 3');
my $myimage = $mygraph->plot(\@data) or die $mygraph->error;
print "Content-type: image/png\n\n";
print $myimage->png;
На результат работы программы можно взглянуть здесь
График с логотипом
Как видите, GD::Graph обладает определенной гибкостью. Попробуем сделать график с логотипом.
#!/usr/local/bin/perl -w
use CGI ':standard';
use lib '/cise/homes/ppadala/mydepot/lib/perl5/site_perl';
use GD::Graph::bars;
use strict;
# Заносим данные
my @data = (['Fall 01', 'Spr 01', 'Fall 02', 'Spr 02' ],
[80, 90, 85, 75],
[76, 55, 75, 95],
[66, 58, 92, 83]);
my $mygraph = GD::Graph::bars->new(500, 300);
$mygraph->set(
x_label => 'Semester',
y_label => 'Marks',
title => 'Grade report for a student',
# Draw bars with width 3 pixels
bar_width => 3,
# Sepearte the bars with 4 pixels
bar_spacing => 4,
# Показывать сетку
long_ticks => 1,
# Показывать значения над столбиками
show_values => 1,
) or warn $mygraph->error;
$mygraph->set(logo => 'lglogo.png');
$mygraph->set(logo_resize => 0.5);
$mygraph->set(logo_position => 'LL');
$mygraph->set_legend_font(GD::gdMediumBoldFont);
$mygraph->set_legend('Exam 1', 'Exam 2', 'Exam 3');
my $myimage = $mygraph->plot(\@data) or die $mygraph->error;
print "Content-type: image/png\n\n";
print $myimage->png;
На результат работы программы можно взглянуть здесь
Тут находится логитип Linux Gazette, который я использовал. Он представлен в формате PNG. В настоящий момент GD::Graph не может работать с какими-либо форматами кроме GIF (но при этом может сохранять и выводить изображение в других форматах).Я написал и отправил патч, который следует применить. ( Текущая версия GD::Graph - 1.35 от 9 июня 2002 г., а статья вышла позже, так что до выхода следующей версии модуля придется применять патч. А.Ч.).
Обычный график
Некоторую информацию удобнее представлять в виде простых всем привычных графиков.
#!/usr/local/bin/perl -w
use CGI ':standard';
use GD::Graph::lines;
use strict;
# Заносим данные.
my @data = (['Fall 01', 'Spr 01', 'Fall 02', 'Spr 02' ],
[80, 90, 85, 75],
[76, 55, 75, 95],
[66, 58, 92, 83]);
my $mygraph = GD::Graph::lines->new(600, 300);
$mygraph->set(
x_label => 'Semester',
y_label => 'Marks',
title => 'Grade report for a student',
# Делаем линии сплошной (solid), пунктирной (dashed), и штрих-точкой (dotted-dashed)
line_types => [1, 2, 4],
# Задаем толщину линий
line_width => 2,
# Задаем цвета
dclrs => ['blue', 'green', 'cyan'],
) or warn $mygraph->error;
$mygraph->set_legend_font(GD::gdMediumBoldFont);
$mygraph->set_legend('Exam 1', 'Exam 2', 'Exam 3');
my $myimage = $mygraph->plot(\@data) or die $mygraph->error;
print "Content-type: image/png\n\n";
print $myimage->png;
На результат работы программы можно взглянуть here
В данном случае я использовал GD::Graph::lines.
Круговая диаграмма
#!/usr/local/bin/perl -w
use CGI ':standard';
use GD::Graph::pie;
use strict;
# Заносим данные.
my @data = (['Project', 'HW1', 'HW2', 'HW3', 'MidTerm', 'Final'],
[25, 6, 7, 2, 25, 35]);
my $mygraph = GD::Graph::pie->new(300, 300);
$mygraph->set(
title => 'Grading Policy for COP5555 course',
'3d' => 1,
) or warn $mygraph->error;
$mygraph->set_value_font(GD::gdMediumBoldFont);
my $myimage = $mygraph->plot(\@data) or die $mygraph->error;
print "Content-type: image/png\n\n";
print $myimage->png;
На результат работы программы можно взглянуть здесь
Для того, чтобы придать диаграмме объем, использовалась опция '3d'.
Диаграмма с областями
#!/usr/local/bin/perl -w
use CGI ':standard';
use GD::Graph::area;
use strict;
# Задаем данные.
my @data = (["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"],
[23, 5, 2, 20, 11, 33, 7, 31, 77, 18, 65, 52]);
my $mygraph = GD::Graph::area->new(500, 300);
$mygraph->set(
x_label => 'Month',
y_label => 'Number of Hits',
title => 'Number of Hits in Each Month in 2002',
) or warn $mygraph->error;
my $myimage = $mygraph->plot(\@data) or die $mygraph->error;
print "Content-type: image/png\n\n";
print $myimage->png;
На результат работы программы можно взглянуть здесь
Заключение
Модуль GD::Graph является достаточно удобным инструментом и неплохо подходит для создания динамических иллюстрация к вебстраницам. Надеюсь, что статья вам понравилась. В следующий раз мы поговорим об использовании модуля PerlMagic.
Оригинал статьи размещен в LinuxGazette
Создание графики на лету с использованием GD
Оглавление раздела
|