Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
 

   Интернет технологии -> Perl -> Программирование на PERL


Исследование Perl модулей, часть 2: Рисуем диаграммы с использованием GD::Graph

Pradeep Padala, перевод Алексей Чегляков ( providerZ.ru )

Введение

Если вы читали мою предыдущую статью про 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
Оглавление раздела

 

 
Интересное в сети
 
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full


Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
 
Это интересно
 

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.