Шаблоны научной графики в eps формате

В этой статье дается инструкция как пользоваться готовыми шаблонами eps рисунков научной графики. Эти шаблоны представляют собой готовые программы рисунков на языке постскрипт, код которых записан таким образом, что он легко читается и достаточно его немного отредактировать в текстовом редакторе, чтобы получить новый рисунок. Чтобы пользоваться шаблонами в полной мере, полезно предварительно прочитать мою книгу о постскрипте, которая существует онлайн по этому адресу . Там же написано как организовать среду разработки eps рисунков.

Система графиков 1D функций в ящике осей аргумент-функция.

Для удобства работы шаблон разбит на две части, записанные в два файла. Оба файла находятся в zip архиве, скачать который можно по этой ссылке . Файл [ps-proc.txt] содержит готовые процедуры на языке постскрипт, изучать которые не обязательно. Достаточно только знать как ими пользоваться. Основной файл шаблона [figure.eps] подключает этот файл с помощью команды run. Это вполне удобно и работает с версией интерпретатора gstools (5.50,2.6). Однако, если посылать файл в редакцию научного журнала, то вместо этой команды следует скопировать в eps файл содержимое указанного выше файла [ps-proc.txt], потому что редакции требуют рисунки в виде одного файла.

Я буду считать, что читатель скачал файлы и открыл их в отдельном окне текстового редактора. Можно использовать любой текстовый редактор, но лучше какой-либо из более продвинутых, чем стандартный Notepad. Вот ссылка на сайт моего текстового редактора . У него есть очень много полезных функций, в частности, проверка правописания. Итак, открываем текст файла [figure.eps] в текстовом редакторе и смотрим что там написано. Текст очень небольшой. В первой строке стоит указание на формат рисунка. Это просто комментарий, но он необходим. Во второй строке стоит еще один комментарий, который, однако, имеет важное значение для программы gstools, потому что там указаны 4 числа -- координаты левого нижнего и правого верхнего углов области в единицах pt = 0.353 мм, которую программа и будет показывать в режиме "EPS Clip".

Эта команда также нужна для программы компилятора pdf файла из latex файла, то есть при создании научной статьи на языке latex. В журналах IUCr (международного общества кристаллографов, то есть Acta Cryst., J. Synchr. Rad.) eps файлы используются без масштабирования, то есть нужно явно указывать тот размер, который и будет поставлен. Для вставки рисунка в одну колонку стандартный размер по ширине 240. А размер по высоте зависит от содержимого рисунка. На самом деле масштабировать можно, но проще масштабировать сам eps рисунок в eps файле. В третьей строке стоит указанная выше команда, которая вставляет содержимое файла, имя которого находится в круглых скобках, вместо самой команды.

Далее через пустую строку записаны два блока команд, которые очень похожи, и отличаются только значениями чисел-аргументов команд. Достаточно разобрать один блок, чтобы понять как это работает. Я напомню, что в постскрипте аргументы команды пишутся перед именем команды и никак не выделяются. Сами команды могут быть как без аргументов, так и с очень большим числом аргументов. Итак начинаем разбор.

Команда gs (graph save) без аргументов запоминает текущие параметры рисования. Команда slw (set line width) с одним аргументом устанавливает ширину линий при рисовании линий в единицах pt. Сразу скажу, что все размеры на графике измеряются в этих единицах и больше я об этом писать не буду. Команда srgb (set rgb) с 3 аргументами устанавливает цвет линий как комбинацию красного, зеленого и синего. Интервал изменений от 0 (нет) до 1 (максимум). Команда tr (translate) с двумя аргументами устанавливает перемещение всех координат рисунка на указанные отрезки по x и y осям. Это общие команды графики, применимые ко всем объектам на рисунке.

Далее следуют конкретные команды рисования научного графика. Первая команда par имеет 9 аргументов и задает общие параметры графика. Для удобства каждый параметр описан на отдельной строке с номером
1.  длина горизонтальной оси в единицах pt
2.  длина вертикальной оси в единицах pt
3.  длина коротких рисок на осях в единицах pt
4.  длина длинных рисок на осях в единицах pt
5.  размер текста для написания чисел при длинных рисках в единицах pt
6.  значение аргумента на левом конце горизонтальной оси в физических единицах
7.  значение аргумента на правом конце горизонтальной оси в физических единицах
8.  значение функции на нижнем конце вертикальной оси в физических единицах
9.  значение функции на верхнем конце вертикальной оси в физических единицах

Следующая команда parx дополнительно задает параметры горизонтальной оси. Их три. Первый параметр указывает значение, соответствующее первой длинной риске в физических единицах, второй -- интервал значений между двумя длинными рисками, третий -- число коротких рисок между длинными. Эти две команды надо писать перед тем как рисовать сами оси. Далее команда axx без аргументов просто рисует нижнюю горизонтальную ось, а команда axx1 тоже без аргументов рисует верхнюю горизонтальную ось. Удобство такой конфигурации команд в том, что если какую-то ось не надо рисовать, то просто не пишем команду рисования и все.

Далее, команда parf с 3 аргументами задает дополнительные параметры рисования вертикальной оси аналогично команде parx. Затем команда axf рисует левую вертикальную ось, а команда axf1 рисует правую вертикальную ось. Оси нарисованы, осталось начертить кривые значений функций внутри этих осей. Каждую кривую рисует команда figl, которая может иметь очень много аргументов в виде чисел. Более того, перед вызовом этой команды можно снова запустить команду slw и переопределить толщину линий. Также точно командой srgb можно переопределить цвет линий. В указанном примере рисуются две кривые и перед ними один раз переопределяется толщина линий.

Рассмотрим как надо записывать аргументы этой команды. Пусть вам известны N точек кривой с постоянным шагом изменения аргумента. Только такой случай и предполагается. Тогда сначала записываются эти N значений. В указанном примере N = 16. Записывать числа можно в любой нормировке, желательно целыми числами для уменьшения размера файла. Вместо самих чисел при отладке можно указать имя файла командой run, в котором эти числа будут записаны, если их слишком много. Но в окончательном варианте все команды run нужно убрать и заменить их на содержание файлов. После всех значений функции (на отдельной строке для удобства чтения, хотя это не обязательно) нужно записать еще 4 аргумента. Они имеют такой смысл
1. Значение аргумента у первого значения функции
2. Значение аргумента у последнего значения функции
3. Число точек на кривой, то есть число значений функции
4. Множитель, на который надо умножить все значения функции до рисования.
Множитель должен быть таким, чтобы все значения находились в интервале разметки вертикальной оси. Как раз этот множитель позволяет записывать все значения как целые, а потом получить те значения, какие есть на самом деле.

Последняя команда gr (graph restore) восстанавливает те значения графики, которые были сохранены командой gs. Это касается толщины линий, цвета, смещений, вращений и других аналогичных параметров. Таким же точно способом рисуется второй график. Но если первый график смещается вверх на 150, то второй -- на 40. И таким образом первый график оказывается над вторым.

Далее в тексте идут команды рисования текстов как около осей графика, так и на самом графике. Эти команды общие для всех постскрипт рисунков, и они частично описаны в указанной выше книге. Общий принцип таких команд простой. Команда m с двумя аргументами задает координаты текста на рисунке. Команды L, Lc, Le, B, Bc, I, G, H с одним аргументом в виде текста в круглых скобках рисуют этот текст разными шрифтами и с разным положением. Удобно указать их в таблице
L == шрифт Palatino-Roman, текст справа от указанной точки
Lс == шрифт Palatino-Roman, указанная точка в центре текста
Le == шрифт Palatino-Roman, текст слева от указанной точки
B == шрифт Palatino-Bold, жирный текст справа от указанной точки
Bc == шрифт Palatino-Bold, указанная точка в центре жирного текста
I == шрифт Palatino-Italic, наклонный текст справа от указанной точки
G == шрифт Symbol, текст справа от указанной точки
H == шрифт Helvetica, текст справа от указанной точки
Можно приготовить еще больше команд для других шрифтов и других расположений текста, но обычно этих команд вполне хватает для графика. Все шрифты, кроме G, рисуют латинские буквы, а шрифт G может рисовать греческие буквы и специальные символы, хотя они все равно в тексте задаются латинскими буквами. Таблицу соответствия можно выяснить эмпирическим путем. Для этого достаточно нарисовать одинаковые символы в разных шрифтах.

Что касается русских шрифтов, то их в постскрипте нет, точнее не так, они есть, но программа gstools (5.50,2.6) их автоматически не понимает. Как работать с русскими текстами написано в книге, и я не буду здесь это переписывать. Для научной графики вполне можно обойтись и без русских текстов. Текст рисуется слева направо и сдвиг курсора происходит автоматически после рисования каждой буквы. После указанных команд можно также писать команды ib или it. Тогда текст перед ними в круглых скобках будет нарисован как нижний или верхний индекс к предыдущему тексту. Что касается размера шрифта, то автоматически предполагается размер 12pt. Если нужен другой размер, то есть два способа.

Первый способ состоит в том, что перед рисованием текста можно указать любую из 5 команд масштабирования, которые имеют имена is1, is2, is3, is4, is5. Эти команды будут увеличивать текст с множителями 1.25, 1.5625, 2, 3.125, 4. После рисования текста масштабирование можно вернуть на место командами ds1, ds2, ds3, ds4, ds5. Каким номером был увеличен текст, таким же номером его надо и уменьшить. Или наоборот, можно сначала уменьшить, а потом увеличить. Использование одного и того же номера гарантирует полное восстановление режима масштабирования.

Второй способ использован в примере. Дело в том, что размер шрифтов в указанных выше командах задается переменной FS. Исходно она определена как 12. Но ее можно переопределить в любое время вот таким текстом /FS 10 def . Это уже чистый постскрипт, команда определения констант. После нее все указанные команды будут рисовать размером 10 pt вместо исходных 12 pt. Такой способ позволяет менять размер шрифтов произвольным образом и много раз в процессе рисования рисунка.

Вот и все, что есть в примере рисунка. Замечу, что на одном рисунке может быть сколько угодно графиков разного размера, а на каждом из них сколько угодно функций. Какие-то графики могут быть внутри других графиков, и все это очень просто форматируется теми же самыми командами, только меняются значения аргументов. На графиках или рядом с ними могут быть другие объекты типа растровых картинок или шариков. Просто нужно уметь все это рисовать. Но на любые объекты есть свои шаблоны, достаточно иметь библиотеку таких шаблонов.

Теперь обсудим то, чего на рисунке нет. Рассмотренный пример не показывает всех возможностей графиков. Дело в том, что тут команда axx рисует нижнюю горизонтальную ось с рисками и числами, а команда axx1 рисует верхнюю горизонтальную ось без чисел. Иногда бывает так, что надо наоборот. Для этого есть команда axx0, которая рисует нижнюю горизонтальную ось без чисел, и команда axx2, которая рисует верхнюю горизонтальную ось с числами. Аналогично есть команды axf0 и axf2 для вертикальных осей.

Более того, есть команды рисования логарифмических осей axlx и axlf по горизонтали и по вертикали. Если очень надо, то смотрите описание этих команд в моей книге о постскрипте. Но я попробовал такие оси, и мне не понравилось. Проще написать, что рисуется логарифм и дать нормальные оси. Наконец, функции можно рисовать не только линиями, но и маркерами. Для этого есть команда figm, которая по структуре своих аргументов полностью аналогична команде figl, но использует команду mark, которую можно переопределить, если стандартные маркеры, заданные этой командой, не устраивают. Она имеет два аргумента -- координаты точки на графике.

Если захочется рисовать на графике отрезок прямой линии, то можно использовать команду ls, которая имеет 4 аргумента, координаты начала и конца линии. Ломаную линию из многих отрезков можно нарисовать командами m -- один раз, начало, два аргумента, координаты, l -- много раз, координаты второй, третьей и остальных точек, и sl -- один раз, указание на то, что линия закончена и ее можно рисовать. Вместо команды l можно использовать команду rl. Ее аргументами должны быть не абсолютные координаты точки, а разность координат данной точки и предыдущей точки. Иногда задавать такие разности более удобно. Есть команда, которая рисует головку стрелки Arr, она имеет 4 аргумента, координаты точки вершины, угол вращения и масштабирование. Какие значения нужно задавать можно узнать эмпирическим путем. Саму стрелку надо рисовать в два приема, отдельно линию, отдельно головку или две головки, если необходимо.

Виктор Кон, 11-01-2017



  Внимание! Сайт оптимизирован под браузер Google Chrome.