psplot.pm - небольшая библиотека для рисования двумерных графиков (x,y) для PDL. Координаты точек хранятся в одномерных piddles. Процедура draw возвращает Postscript-текст для картинки в EPS. Используется псведообъектный подход: создаются оси, содержащие кривые, стрелки, и т.п.
ВНИМАНИЕ: ПРОГРАММА НОВАЯ И СЫРАЯ, ОБ ОШИБКАХ СООБЩАЙТЕ, ВРОДЕ РАБОТАЕТ, НО ЗА ТОНКОСТИ НЕ УВЕРЕН.
Для работы требуется PDL.
Пример:
#!/usr/bin/perl -w
use PDL; use psplot;
my $L = 120;
my $myx = sequence ($L) / ($L-1) * 3.1415926 * 2 * 10000;
my $myy = 0.00000001*sin $myx;
my $cur = curve $myx, $myy, 'g-vF'; #curve of ($myx,$myy) points, connected by green lines, marked by filled triangles
my $axes = axes $cur, dbox => 1, title '\hat P\check L\bar O\dot T with \gamma\rho\epsilon\epsilon\kappa\ and_{lower}^{upper}\ indices!';
#axes containing the curve created beforehand and a title with some latex symbols.
$myy = 0.00000001*cos $myx;
$cur = curve $myx, $myy, 'ro'; #another curve
add $axes, $cur, arrow, xlabel '$\pm\partial_t^{2}\dot{T}\alpha_0 \mp \bar\Omega\times\beta^{3+t_0} - \cos^{-2}(\check z)$, i.e. abscissae, \promil, ^{\circ}C',
ylabel '\hat y_{\partial\hat\omega}+\sin^{\tau-\tau_0}(t_0^2), i.e. ordinatae, \S 6.6';
$PS = draw $axes; #create PostScript code and put it to $PS
См. также пример в файле testpsplot.pl, а также генерируемую им картинку в формате EPS.
ПРОЦЕДУРЫ
Опишем процедуры и объекты, с котороми они работают.
axes
Создает новую координатную систему со свойствами по умолчанию, если они не заданы в виде пар ключ-значение. Список кривых может передаваться без ключа. Примеры: $axes = axes; $axes = axes curve $x,$y; $axes = axes curve $x,$y,'r0F'; Полезные ключи: name (по умолчанию figure#), bbox (bounding box для EPS), xticks и yticks (позиции засечек), xtickvals и ytickvals - метки засечек, bkgrndcolor (массив [0,1]^3, цвет фона в RGB), size (типичный размер (pt) для осей: засечки, стрелки и т.п.), font, fontsize, leftbottommargins (левый нижний угол прямоугольника по отношению к углу bounding box), origin (начало отсчета по отношению к углу), righttopmargins (место выше и правее прямоугольника), dbox (числовое значение - это толщина обрамляющего прямоугольника в 0.5pt, нуль означает отсутствие обрамления), boxcolor (RGB), dxaxis и dyaxis (толщина осей в 0.5pt, 0 означает "нет осей"), dxticks и dyticks (то же для засечек), dxgrid и dygrid (то же для сетки), xtickshift и ytickshift (засечку можно сдвинуть вних или влево на указанную долю ее длины), hold (если ложь, то диапазоны x и y пересчитываются при добавлении новой кривой, а если истина, то "что не влезло, то пропало").
add
Добавляет кривые и другие объекты к осям; скалярные параметры задаются при помощи modify. Первый аргумент - оси. Остальные - объекты, в том числе кривые, стрелки, подписи, легенды и т.п. Другие оси не добавляются, а возвращаются в после модифицируемых в списке (в списковом контексте), нетронутыми. В скалярном контексте просто теряются. Пример: add $axes, curve $x,$y,'ro', arrow, xlabel 'abscissa', ylabel 'ordinata'; Здесь создается объект ylabel - метка оси ординат - и она передается конструктору метки оси абсцисс xlabel, но он, создав ее, возвращает обе в списковом контексте.Они идут конструктору стрелок - он создает стрелки и возвращает их и обе метки в списке, который направляется конструктору кривой curve. Он создает кривую и возвращает ее и полученные объекты нетронутыми. Этот список во главе с осями передается add, которая и добавляет к осям все эти объекты. Можно расставить скобки для большей ясности: add($axes, curve($x,$y,'ro'), arrow(), xlabel('abscissa'), ylabel('ordinata'));
arrow
Создает объект "стрелки", описывающий стрелочки на осях. Полезные поля - size (высота треугольника в pt), angle (угол между крыльями стрелки в градусах), style '(open', or 'closed' и 'filled' задает открытую стрелку >, треугольник и заполненный треугольник), и thickness (толщина линии в 0.5pt). Обязательных аргументов нет, поля задаются парами ключ-значение, например arrow size=>24, style=>'closed', angle=>45. Объекты возвращаются в списковом контексте нетронутыми.
title
Создает заголовок. Полезные поля - text, size, font, x и y. Текст - единственный необхоимый аргумент. Может содержать примитивный латех. Размер шрифта size в pt. Шрифт - один из Palatino-Roman, P.-Italic, P.-Bold,, P.-BoldItalic, Times-Roman, T.-Italic, T.-Bold, T.BoldItalic, Helvetica, H.-Oblique, H.-Bold, H.-BoldOblique, Helvetika-Narrow, HNO, ... Symbol,Courier, CO, ..., AvantGarde-Book, AGBOblique, AG_Demi, AGDOblique, Bookman-Demi, BDI, Bookman-Light, BLI, NewCenturySchlbk-Roman, NCSI, NSCB, NSCBI, ZapfDingbats, ZapfChancery-MediumItalic. Задавайте только заглавные буквы в имени шрифта: S, TR, NCSR и т.д. Наконец, x и y определяют верхний левый угол заголовка. Объекты возвращаются в списковом контексте нетронутыми.
xlabel, ylabel
Создают подписи к осям. Поля: text, size, font, direction, x, and y attributes. См. title выше. Текст - единственный необходимый параметр. direction - это угол между направлением текста и осью абсцисс, полезен для вертикальной подписи оси y. Объекты возвращаются в списковом контексте нетронутыми.
marker
Создает маркер - значок, рисуемый в каждой точке данных. Поля: color, thickness, style, fill. Стиль - это один из символов +o*.xsd^v><hHm, отвечающих, соотвественно, +, o, *, ., крестику, квадратику, ромбику, одному из треугольников (вершиной вверх, вниз, вправо и влево), шестиугольник вершиной вверх, шестиугольник вершиной вбок и магендавид (еврейская шестиконечная звезда). Размер в pt. Толщина линии в 0.5pt. Цвет в RGB, трехмерный массив, знаений между 0 и 1; пустой массив означает цвет линии. Флаг fill тмечает, заполнен ли маркер. Помимо пар ключ-значение и объектов (возвращаемых нетронутыми в списковом контексте), аргумент может быть строкой специального вида: необязательный символ цвета в стиле Matlab (rgbcmykw для красного, зеленого, синего, голубого, малинового, желтого, черного и белого), необязательного числа из 1 или 2 цифр для размера, необязательного символа стиля, необязательного флага заполненности F (только если символ стиля указан), и необязательного второго числа между 0 и 99 - для удвоенной толщины линии. Например, 'bmF' - это синий закрашенный магендавид.
curve
Создает кривую - объект, описывающий линию. Поля: x и y - одномерные piddles одного размера, цвет color, толщина thickness в 0.5pt, стиль (solid, dashed, dotted или dashdot - сплошная, пунктирная, точечная, точечно-пунктирная), маркер marker (объект). Обязательны только x и y, и их можно задавать без ключа. Третьим аргументом может быть строка специального вида: символ цвета (rgbcmykw, см. marker выше), символ стиля (- или -- или -. или .), символ маркера (+o*.xsd^v><hHm см. marker выше) с флагом F, если маркер заполненный, и число от 0 до 99 - толщина линии в 0.5pt. Так, 'r--oF4' означает красная пунктирная линия 2 рункта толщиной с закрашенным кружком в каждой точке. Также поля могут задаваться парами ключ-значение. Пример: $sin = curve $x, sin($x), 'b4'. По умолчанию линия черная сплошная толщиной 1pt без маркеров.
curves
Эта процедура создает список кривых, основываясь на аргументах, среди которых piddles с координатами точек и строки атрибутов, см. curve. По сути, разбирает список аргументов и вызывает curve для каждой отдельной кривой. Правила просты:
*. кривые обрабатываются по очереди;
*. строка арибутов в качестве первого аргумента (для очередной кривой) задает новые атрибуты по умолчанию, для всех следующих кривых;
*. одиночный piddle без других аргументов трактуется как массив ординат, а абсциссы - натуральные числа от 1, атрибуты - по умолчанию;
*. одиночный piddle со строкой атрибутов - массив ординат, а абсциссы - натуральные числа от 1;
*. пара piddles без других атрибутов - пара координат x и y, атрибуты по умолчанию;
*. пара piddles и piddle после них - то же самое, третий piddle - от следующей кривой;
*. пара piddles и строкаатрибутов - кривая с заданными атрибутами;
*. объекты возвращаются в списке нетронутыми.
Итак, полный набор - это два piddles и строка атрибутов. Можно опустить строку, полагаясь на атрибуты по умолчанию, которые можно предварительно задать (первым агументом или после строки атрибутов). Иногда можно опустить абсциссы, либо поместив строку после ординат, либо если у Вас всего один piddle. пример: $axes = axes curves 'b4', $x, sin($x), $x, cos($x), $x, sin($x)+cos($x), 'r4';
draw
Рисует оси, то есть генерирует текст на Postscript. Основаня процедура. Аргументы - объект осей со всеми атрибутами, включая кривые, а также список объектов - осей и других объектов, которые добавляются к первым осям списке. Создает заголовок Postscript, рисует оси, затем кривые, легенду, остальные оси, и завершает программу на Postscript. Обычное использование: $PS = draw $axes; Можно собирать оси на лету: $PS = draw axes curve $x,$y, arrows, title 'TITLE';
modify
Позволяет менять атрибуты объектов. Первый аргумент - объект. Далее идут либо объекты (добавляемые посредством add), либо пары ключ-значение. Пример: modify $axes, box => 1, dxgrid => 1, dygrid => 1; Внимание: объекты следует располагать после пар либо использовать скобки.
view
Возвращает массив строк, описывающих хэш, ссылка на который идет первым аргументом. Далее могут идти имена полей - запросы. Примеры: print view $axes, 'lines', 'dbox'; $s = view $curve, 'marker';
meter
Создает специальные оси на основе осей, переданных как аргумент. Это красные оси, отражающие реальную систему координат Postscript. Предназначена для временного вывода с целью удобного размещения объектов по их координатам.
legend
Создает легенду для данных осей. Поля: lines - содержит объекты кривых, образцов линий - вряд ли следует задавать их вручную; labels - описания кривых - вероятно стоит указать, это анонимный массив; font и fontsize; dbox - удвоенная толщина линии для прямоугольника (0 и другая ложь означают отсутствие оного), position - строка, содержащая один из символов L(eft), M(iddle), R(ight) (для левого, среднего и правого расположения) и B(ottom), H(alf), T(op) для нижнего, среднего и верхнего положения; x и y задают координаты левого верхнего угла, а w и h - ширину и высоту. Оси идут первым аргументом, содержимое используется для определения всех полей, кроме подписей. Другие аргументы - анонимный массив строк-описаний кривых, пары ключ-значение, либо объекты, которые возвращаются в списковом контексте нетронутыми. По умолчанию: позиция RT, прямоугольник 2pt толщиной, кривые из осей, как и шрифт; описания кривых по умолчанию - это их имена, если они заданы, либо 'Line #'. x и y вычисляются по позиции, но можно их задать "силой". Пример: $axes = axes curves $x, sin($x), 'r', $x, cos($x), 'k'; add $axes, legend $axes, ['sin', 'cos'];
LaTeX
Заголовок и подписи к осям (а в перспективе и другие надписи) могут содержать некоторые команды LaTeX. Подробнее: простой латинский текст печатается как есть; русский пока не поддерживается, но мы работаем над этим. Символ $ меняет режим на математический и обратно - вся разница в шрифте, математический шрифт, определенный в our $mathfont, курсивный. Символ ^ с одним символом после либо группой в {} печатается как верхний индекс рекурсивно, то есть может содержать индексы. Символ _ аналогично действует для нижнего индекса. Также поддерживаются все греческие буквы, кванторы, набла, cdot, times, pm, mp, промилле promil, circ, параграф S, дифференциал partial; а также несколько акцентов: hat, check, bar, dot, ddot; и пробелы: \ (слэш-пробел, просто пробел), \, (слэш-запятая, полпробела) , \! (отрицательный полпробела); ну и метасимволы вроде \\ , \$ и т.п.
ЗАМЕЧАНИЕ
Обратите внимание, что объекты, передаваемые конструкторам (кроме axes) возвращаются неизменными после создаваемого объекта в списковом контексте. Конструктор axes так поступает с объектами-осями, переданными ему. Так, axes curve $x, $y, title 'TITLE'; работает правильно: объект title создается, передается конструктору curve, а список двух объектов идет конструктору axes. Однако надо быть осторожным с парами ключ=>значение: axes curve $x, $y, dbox=>1; работает НЕВЕРНО, так как устанавливает set $curve{dbox}=1. Пишите либо axes dbox=>1, curve $x, $y; или axes(curve($x, $y), dbox=>1);
Создаваемые оси сохраняются в хэше %figures и доступны по имени, а также в массиве @figures и доступны по номеру. Максимальное число рисунков - 128. Изменение имени посредством modify корректно изменяет элемент хэша.
AUTHOR
Илья А. Чернов (sites.google.com/site/fortrantoday), 2012. Доступна под условиями GNU General Public License. Прошу связываться по поводу ошибок и предложений: blackperler at yandex.ru