Исследование Perl модулей, часть 2: Рисуем диаграммы с использованием GD::GraphPradeep Padala, перевод Алексей Чегляков ( providerZ.ru )ВведениеЕсли вы читали мою предыдущую статью про GD, то могли подумать, что создавать диаграммы и графики с помощью GD будет не слишком удобно. По-видимому эта же мысль пришла в голову Мартину Вербруггену (Martien Verbruggen), который разработал модуль GD::Graph заточенный как раз под подобные задачи. С его помощью можно создавать гистограммы, линейные, круговые, и прочие диаграммы. Этот модель может оказаться очень полезным при обработке статистики загруженности сети, посещения сайта, ну и прочих подобных задачах. В этой статье я опишу общие принципы использования модуля и продемонстрирую их несколькими примерами. Типичное использование GD::GraphPerl скрипт с использованием GD::Graph как правило состоит из следующих вещей:
Пристой примерНарисуем простой график. Для этого мы напишем 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; На результат работы программы можно взглянуть здесь
Код приграммы говорит сам за себя. Настройка опцийКак вы видите, мы нарисовали чрезвычайно простой график. Мы можем сделать его посимпатичнее подкрутив некоторые свойства. Диаграммы разного типа обладают некоторым набором общих свойств, но есть так же и свойства, характерные для каждого типа диаграмм. Свойства могут быть заданы при создании диаграммы $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. |