Исследование Perl модулей, часть 2: Рисуем диаграммы с использованием 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 является достаточно удобным инструментом и неплохо подходит для создания динамических иллюстрация к вебстраницам.


Источник статьи