Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Визуализация научных данных: введение в PGF/TikZ

Оригинал: Scientific Graphics Visualisation: An Introduction to PGF/TikZ
Автор: Deepu Benson
Дата публикации: 28 июня 2018 года
Перевод: А. Кривошей
Дата перевода: октябрь 2019 г.

Это вторая статья в серии из трех частей о визуализации научных данных. Она охватывает программное обеспечение PGF/TikZ, которое является бесплатным и имеет открытый исходный код. Она также затрагивает форматы графических файлов LaTeX и PSTricks.

В первой части этой серии мы обсуждали Matplotlib, графическую библиотеку для Python. В этой статье мы обсудим PGF/TikZ, пару языков, используемых для создания векторной графики. Возможно, пришло время подробно обсудить различия между векторной и растровой графикой.

Растровые графические изображения состоят из пикселей, которые являются наименьшим элементом в устройстве отображения. Если вы будете увеличивать растровое изображение, то в какой-то момент вы начнете видеть множество мелких точек. Качество изображения при дальнейшем увеличении масштаба снижается. Распространенные форматы растровых изображений включают JPEG, TIFF, GIF, BMP, PNG и т. д. Векторные изображения, с другой стороны, рисуются с помощью линий и фигур. Векторное графическое изображение всегда будет выглядеть одинаково, даже при увеличении до очень больших размеров. Популярные форматы векторной графики включают AI (Adobe Illustrator), EPS (Encapsulated PostScript), SVG (масштабируемая векторная графика) и т. д. Из-за высокого качества изображений для технических диаграмм всегда лучше использовать векторную графику.

Краткое введение в LaTeX

Хотя PGF/TikZ можно использовать с ConTeXt и оригинальным TeX, он наиболее широко используется с LaTeX. Поэтому, краткое введение в LaTeX абсолютно необходимо, прежде чем перейти к PGF/TikZ. Из-за этой тесной связи между ними PGF/TikZ можно рассматривать как пакет LaTeX для программирования графики. LaTeX - очень популярная кроссплатформенная система подготовки документов. Это бесплатное программное обеспечение с открытым исходным кодом, лицензированное в рамках общественной лицензии проекта LaTeX (LPPL). LaTeX был разработан Лесли Лампортом. Он основан на TeX, системе набора текста, разработанной Дональдом Кнутом.

Очень часто люди рассматривают LaTeX и TeX как одно и то же, но это не так. Принципиальное различие между ними можно понять с помощью следующего примера. Рассматривайте TeX как язык программирования без встроенных функций, а LaTeX как расширение к этому языку, содержащее множество встроенных функций. В целом можно сказать, что TeX гораздо сложнее в освоении и использовании по сравнению с LaTeX. Дистрибутив TeX, такой как TeX Live, часто используется в среде Linux для получения доступа к LaTeX. При подготовке документов с помощью LaTeX вместо форматирования текста используются команды для получения специальных эффектов, таких как полужирный шрифт, курсив и т. д. Например, в текстовых процессорах, таких как LibreOffice Writer или Microsoft Word, текст будет выделен жирным шрифтом или курсивом; тогда как в файле LaTeX вы увидите только такие команды, как \textbf или \textit, для обеспечения того же эффекта. После обработки этого файла LaTeX, вы получите выходной документ, который покажет форматированный текст.

Два прямоугольника, нарисованные с помощью PGF/TikZ

Рисунок 1: Два прямоугольника, нарисованные с помощью PGF/TikZ

Три цветных треугольника, нарисованных с помощью PGF/TikZ

Рисунок 2: Три цветных треугольника, нарисованных с помощью PGF/TikZ

Обычно при исполнении из документов LaTeX создают файлы PDF (Portable Document Format) или DVI (device independent file format) в качестве выходных данных. Рассмотрим простой скрипт LaTeX «Hello.tex», показанный ниже, содержащий только абсолютно необходимые функции LaTeX. Этот сценарий LaTeX и все другие сценарии PGF/TikZ, обсуждаемые в этой статье, можно загрузить с opensourceforu.com/article_source_code/May18graphicsvisualisation.zip.

\documentclass{article}
\begin{document}
\textbf{\textit{Hello World}}
\end{document}

Из самого имени Hello.tex ясно, что расширение файла LaTeX - tex. Мы используем этот файл LaTeX в качестве шаблона для выполнения всего кода PGF/TikZ, обсуждаемого в этой статье. Во-первых, давайте рассмотрим этот минимальный пример LaTeX, строка за строкой. Строка кода \documentclass{article} определяет класс документа как статью. Другие классы документов, предоставляемые LaTeX, включают в себя письма, книги, отчеты и т. д. Я полагаю, что кроме класса beamer, который используется для создания презентаций с использованием LaTeX, назначение всех других классов документов, указанных здесь, ясно из их названий. Строки кода \begin{document} и \end{document} определяют область, в которой могут быть заданы фактические данные выходного документа. В этом случае у нас есть только одна строка кода в части содержимого документа LaTeX, \textbf{\ textit{Hello World}}. Эта строка указывает интерпретатору LaTeX печатать текст «Hello World» жирным шрифтом и курсивом.

Итак, теперь у нас есть готовый к запуску файл LaTeX, но как лучше всего его обработать? Существуют разные способы обработки файлов LaTeX. Например, вы можете использовать Overleaf, систему коллективного создания документов и публикации, которая может обрабатывать код LaTeX. Но в этой статье я буду применять два других метода обработки LaTeX.

Во-первых, давайте запустим из терминала интерпретатор LaTeX. Откройте терминал в каталоге, содержащем файл LaTeX Hello.tex и выполните команду latex Hello.tex. При ее выполнении LaTeX создаст документ Hello.dvi с текстом «Hello World», напечатанным жирным шрифтом и курсивом. По умолчанию формат вывода LaTeX - DVI. Если вам нужен выходной файл в формате PDF, выполните команду pdflatex Hello.tex, которая будет использовать расширение LaTeX с именем pdfLaTeX для создания выходного файла Hello.pdf с тем же содержимым, что и у файла Hello.dvi.

Второй способ - использовать редактор LaTeX, такой как Texmaker, популярный бесплатный кросс-платформенный редактор LaTeX с открытым исходным кодом и встроенным средством просмотра PDF и DVI. Откройте файл LaTeX Hello.tex в Texmaker и в меню вы найдете пункты Tools>LaTeX и Tools>PDFLaTeX для запуска LaTeX и его расширения pdfLaTeX. Используете ли вы LaTeX, pdfLaTeX или Texmaker, форматированный текст в выходном документе будет одинаковым. Несмотря на то, что Texmaker имеет встроенную опцию для просмотра выходных файлов PDF и DVI, убедитесь, что в вашей системе есть средство просмотра документов, такое как Okular, которое способно отображать файлы DVI и PDF. Есть много других LaTeX-редакторов, таких как TeXstudio, TeXworks, Kile и т. д. Использование Texmaker - это личный выбор, и я советую вам попробовать любой из других доступных LaTeX-редакторов, а затем выбрать тот, который вам нравится больше всего. Также помните, что иногда вам придется обрабатывать файл LaTeX несколько раз, чтобы получить правильные метки, библиографию, указатели и т. д.

Одной из проблем, которая часто смущает новых пользователей LaTeX, является большое количество создаваемых им вспомогательных файлов. Если вы посмотрите на каталог, содержащий файл Hello.tex, вы увидите файлы с именами Hello.aux и Hello.log, помимо выходных файлов Hello.pdf и Hello.dvi. И по мере того, как ваш документ LaTeX становится все более сложным, количество таких файлов также увеличивается. Я не собираюсь объяснять назначение всех этих вспомогательных файлов в этой статье, но вам не нужно беспокоиться, потому что из большого количества созданных файлов вам нужно беспокоиться только о файле LaTeX с расширением tex и файлами с расширениями pdf и dvi. Все остальные файлы можно восстановить, запустив интерпретатор LaTeX.

Четыре цветных концентрических круга, нарисованных с помощью PGF/TikZ

Рисунок 3: Четыре цветных концентрических круга, нарисованных с помощью PGF/TikZ

Введение в PGF/TikZ

Теперь, когда мы знакомы с тем, как работает LaTeX, давайте поговорим о PGF/TikZ, который был разработан Тиллем Тантау с использованием TeX. Как упоминалось ранее, это не один инструмент, а два отдельных языка в паре для создания высококачественной векторной графики. PGF - это язык низкого уровня, а TikZ - это набор макросов более высокого уровня, которые используют PGF. Отношения между PGF и TikZ отчасти похожи на отношения между TeX и LaTeX, первый из которых указывает основной синтаксис, а второй предоставляет макросы для простоты использования.

TikZ был впервые представлен с версией PGF 0.95. Последняя версия PGF/TikZ - 3.0.1, выпущенная в августе 2015 года. PGF - это аббревиатура от «portable graphics format». TikZ - это рекурсивная аббревиатура для «TikZ ist kein Zeichenprogramm», в переводе с немецкого «TikZ - это не программа для рисования», утверждающая тот факт, что это языки программирования, способные использовать мощные функции. В отличие от другого популярного инструмента визуализации графики, называемого PSTricks, в котором используется синтаксис, напоминающий PostScript, PGF и TikZ описывают изображения, которые должны быть нарисованы, используя синтаксис, похожий на MetaPost, язык, который используется для создания векторных диаграмм.

Эта чрезмерная зависимость PSTricks от PostScript одновременно является и преимуществом и недостатком. Среди недостатков PSTricks ограниченные форматы вывода, которые он предлагает (PSTricks может производить вывод только в PostScript, а не в PDF) и несовместимость с некоторыми связанными инструментами LaTeX, такими как pdfTeX. Но PGF/TikZ способен производить вывод как в формате PostScript, так и в формате PDF, и обладает высоким уровнем совместимости со всеми инструментами, связанными с LaTeX, что делает знания о PGF/TikZ очень важными.

Простой пример PGF/TikZ

PGF/TikZ создает векторную графику из геометрического описания изображения, которое рисуется с помощью собственного набора инструкций. Прежде чем продолжить изучение кода, давайте обсудим два важных аспекта PGF/TikZ, а именно точки и пути. Точки относятся к конкретному месту на двумерной плоскости. Точки могут быть указаны в декартовых координатах, полярных координатах, как именованные и относительные точки в PGF/TikZ. Чтобы сделать наше обсуждение относительно простым и менее математическим, мы расмотрим только точки, которые описываются в декартовых координатах. Например, декартовы координаты (p, q) относятся к точке, расположенной в p единицах в направлении оси x и в q единицах в направлении оси y. Для простоты понимания начало координат, обозначенное (0,0), можно рассматривать как расположенное в нижнем левом углу плоскости при отображении на экране.

Другим важным аспектом PGF/TikZ является то, как в двумерной плоскости отслеживается путь. Этот аспект трассировки путей в PGF/TikZ объясняется с помощью следующих примеров скриптов. Давайте начнем с простого примера, включающего код PGF/TikZ, чтобы понять, как указываются пути. Рассмотрим скрипт LaTeX pgf1.tex, показанный ниже, который рисует два прямоугольника. Как указывалось ранее, код PGF/TikZ включен в минимальный шаблон LaTeX, упомянутый ранее.

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw (1,1)--(2,1)--(2,3)--(1,3)--cycle;
\draw (4,4)rectangle(5,6);
\end{tikzpicture}
\end{document}

Теперь давайте разберем код в файле pgf1.tex построчно, чтобы лучше его понять. Я объясню только строки кода, недавно добавленные в этот скрипт. Строка кода \usepackage {tikz} гарантирует, что LaTeX может использовать все функциональные возможности пакета TikZ. Строки кода \begin{tikzpicture} и \end{tikzpicture} обозначают интервал, в которой можно вводить код PGF/TikZ для рисования изображений. Строка кода \draw (1,1)--(2,1)--(2,3)--(1,3)--cycle; рисует четыре линии в двухмерной плоскости с помощью команды draw. Первая линия проводится из точки (1,1) в точку (2,1), вторая линия - из точки (2,1) в точку (2,3), третья линия - из точки (2, 3) до точки (1,3), и четвертая линия проводится из точки (1,3) в точку (1,1). Часть кода, которая отвечает за отрисовку четвертой строки: (1,3)--cycle; она завершит прямоугольник, рисуя линию из точки (1,3) до первой точки, используемой в этой команде рисования, которая является точкой (1,1).

Строка кода \draw (4,4)rectangle(5,6); рисует прямоугольник, задавая расположение нижней левой и верхней правой вершин прямоугольника. В этом случае точки (4,4) и (5,6), соответственно, представляют эти две вершины. Обратите внимание, что команды PGF/TikZ заканчиваются точкой с запятой (;), в противном случае возникнет ошибка. Теперь давайте запустим этот скрипт для просмотра нарисованного изображения. Этот скрипт LaTeX может быть выполнен также, как любой другой обычный документ LaTeX - используйте команду pdflatex или latex в терминале, либо используйте Texmaker. Я использовал команду pdflatex pgf1.tex в терминале для создания выходного файла pgf1.pdf. На рисунке 1 показано изображение в документе pgf1.pdf.

Цветные изображения с помощью PGF/TikZ

Рисовать цветные картинки с помощью PGF/TikZ очень просто. Рассмотрим скрипт pgf2.tex, приведенный ниже. В этом скрипте три треугольника нарисованы красным, зеленым и синим цветом.

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[fill=red] (0,1)--(2,1)--(1,3)--cycle;
\draw[fill=green] (3,1)--(5,1)--(4,3)--cycle;
\draw[fill=blue] (6,1)--(8,1)--(7,3)--cycle;
\end{tikzpicture}
\end{document}

Единственная строка кода, которая нуждается в объяснении, это \draw[fill=red] (0,1)–(2,1)–(1,3)–cycle;. Эта строка рисует треугольник, рисуя три линии. Первая линия проводится из точки (0,1) в точку (2,1), вторая линия - из точки (2,1) в точку (1,3), а третья линия - из точки (1,3) в точку (0,1), образуя треугольник. Цвет, которым будет закрашен треугольник, задается в качестве опции для команды рисования. Возможность закрасить треугольник красным цветом задается кодом [fill = red]. Оставшиеся две линии в окружении tikzpicture в LaTeX рисуют еще два треугольника и заполняют их зеленым и синим цветом. При выполнении команды pdflatex pgf2.tex будет создан выходной файл с именем pgf2.pdf. На рисунке 2 показано изображение в документе pgf2.pdf.

Есть и другие опции, доступные с командой draw. Например, есть варианты изменить цвет линии с черного по умолчанию, изменить толщину рисуемой линии и т. д. Замените три строки кода в среде tikzpicture скрипта pgf2.tex на строки:

\draw[yellow, very thick, fill=red] (0,1)–(2,1)–(1,3)–cycle;
\draw[yellow, very thick, fill=green] (3,1)–(5,1)–(4,3)–cycle; 
\draw[yellow, very thick, fill=blue] (6,1)–(8,1)–(7,3)–cycle;

чтобы получить pgf3.tex. При выполнении команды pdflatex pgf3.tex этот скрипт создаст выходной документ с именем pgf3.pdf, в котором будут треугольника, нарисованных толстыми желтыми линиями и закрашенных красным, зеленым и синим цветом. Скрипт pgf3.tex также доступен для скачивания.

Вывод pgf6.tex

Рисунок 4: Вывод pgf6.tex

Рисование окружностей с помощью PGF/TikZ

Теперь давайте посмотрим, как рисовать круги, используя PGF/TikZ. Рассмотрим скрипт pgf4.tex, показанный ниже.

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[fill=red] (0,0) circle (4cm);
\draw[fill=green] (0,0) circle (3cm);
\draw[fill=blue] (0,0) circle (2cm);
\draw[fill=orange] (0,0) circle (1cm);
\end{tikzpicture}
\end{document}

Единственная строка кода, которая требует объяснения, это \draw[fill=red] (0,0) circle (4cm);. Эта строка рисует красный круг радиусом 4 см с центром в точке (0, 0) и заполняет этот круг красным цветом. Оставшиеся три строки в окружении tikzpicture в LaTeX рисуют еще три окружности с радиусом на 1 см меньше предыдущего и с центром в той же точке, так что в выходном файле мы нарисовали четыре концентрических окружности. При выполнении команды pdflatex pgf4.tex в терминале четыре концентрических круга отображаются красным, зеленым, синим и оранжевым цветами. На рисунке 3 показан вывод скрипта pgf4.tex.

Помните, что компоненты изображения с несколькими слоями отрисовываются в том порядке, в котором идут строки кода, соответствующие определенному компоненту. В предыдущем примере (pgf4.tex) сначала рисуется красный круг с радиусом 4 см, затем зеленый круг с радиусом 3 см, затем синий круг с радиусом 2 см и, наконец, оранжевый круг с радиусом 1 см. Для лучшего понимания давайте изменим скрипт pgf4.tex таким образом, чтобы круги были нарисованы в обратном порядке - сначала был нарисован наименьший круг, и так далее, - чтобы получить pgf5.tex. Теперь, каким будет изображение, нарисованное в выходном документе pgf5.pdf, когда с помощью команды pdflatex pgf5.tex будет выполнен модифицированный файл LaTeX pgf5.tex (показанный ниже)?

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[fill=orange] (0,0) circle (1cm);
\draw[fill=blue] (0,0) circle (2cm);
\draw[fill=green] (0,0) circle (3cm);
\draw[fill=red] (0,0) circle (4cm);
\end{tikzpicture}
\end{document}

Вы можете быть немного удивлены, увидев, что в выходном файле pgf5.pdf нарисован один красный круг с радиусом 4 см. Уверяю вас, мы не сделали ничего плохого. Так работает PGF/TikZ. Попытайтесь выяснить причину этого ненормального поведения. Если вы не можете найти ответ, я добавил его в качестве комментария в файл pgf5.tex, доступный для скачивания.

Циклы в PGF/TikZ

Пока что мы нарисовали два прямоугольника, три треугольника и четыре круга. Что произойдет, если нас попросят нарисовать сто треугольников или тысячу кругов? Для этого в PGF/TikZ есть циклы. PGF/TikZ имеет много эффективных структур для зацикливания и управления, которые помогают нам с относительной легкостью рисовать большое количество изображений. Рассмотрим пример скрипта pgf6.tex, показанный ниже, который использует цикл foreach, предоставляемый PGF/TikZ.

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \x in {1,2,...,9} {
\foreach \y in {1,2,3} {
\draw[fill=red!\x\y!green] (\x,\y) circle (4mm);
}
}
\end{tikzpicture}
\end{document}

Строка кода \foreach \x in {1,2,…,9} { определяет внешний цикл, который повторяется девять раз. Строка кода\foreach \y in {1,2,3} { определяет внутренний цикл, который повторяется три раза. Таким образом, строка кода \draw[fill=red!\x0!green] (\x,\y) circle (4mm); внутри цикла выполняется в общей сложности 27 раз и, следовательно, рисует 27 кругов, каждый из которых имеет радиус 4 мм. Центры этих кругов определяются фрагментом кода (\x \y). Следовательно, центры не являются фиксированными - это точки (1,1), (1,2), (1,3), (2,1), (2,2), (2,3),…, (9,1), (9,2) и (9,3), в общей сложности 27 точек в двумерной плоскости, создающихся при изменении значений переменных x и y внутри внешнего и внутреннего циклов.

Фрагмент кода [fill=red!\x\y!green] определяет цвет заливки кругов. Фрагмент кода red!40!green определяет круг, в котором 40% красного, а остальные 60% зеленого. Таким образом, в этом случае, поскольку значения переменных x и y изменяются внутри циклов, никакие два круга не будут иметь одинаковый цвет. Но, возможно, не удастся определить разницу в цвете между кругом с 11% красного и 89% зеленого и другим кругом с 12% красного и 88% зеленого. Вот почему некоторые из соседних кругов могут выглядеть одинаковыми по цвету. При выполнении команды pdflatex pgf6.tex файл LaTeX pgf6.tex создаст выходной файл pgf6.pdf с изображением, показанным на рисунке 4.

Давайте изменим только одну строку кода в файле pgf6.tex, чтобы получить pgf7.tex. Строка кода \foreach \y in {1,2,3} { в pgf6.tex заменяется строкой \foreach \y in {1,2,…,12} { в pgf7.tex. Выполнив файл pgf7.tex с помощью команды pdflatex pgf7.tex, вы получите выходной файл с именем pgf7.pdf с изображением, показанным на рисунке 5. Всего несколько символов добавляются в одну строку кода, и изображение резко меняется. Я полагаю, что этот пример ясно иллюстрирует преимущество использования инструментов графического программирования, таких как PGF/TikZ и PSTricks, а не обычного программного обеспечения для рисования изображений. Представьте себе, сколько времени потребуется, чтобы нарисовать техническую диаграмму, аналогичную той, которую мы обсуждали, с множеством компонентов изображения, размещенных в определенных местах, если бы мы использовали обычное программное обеспечение для рисования изображений.

Пришло время завершить нашу дискуссию. Теперь вы должны иметь возможность писать и выполнять сценарии LaTeX, встроенные в сценарии PGF / TikZ, для создания DVI-файла или файла PDF в качестве вывода, либо с помощью LaTeX или pdfLaTeX в терминале, либо с помощью популярного редактора LaTeX Texmaker. Мы пропустили несколько важных тем, таких как трехмерное рисование, рисование в классе документа beamer в LaTeX и т. д., но введение, данное в этой статье, безусловно, даст вам преимущество перед другими. На мой взгляд, PGF/TikZ - это мощное оружие в руках профессионалов, которым необходимо создавать технические диаграммы хорошего качества.

Вывод pgf7.tex

Зачем изучать PSTricks?

PSTricks - еще один мощный инструмент для визуализации научной графики, используемый вместе с LaTeX. Последний вопрос, на который я хочу ответить перед завершением этой статьи: «Зачем изучать PSTricks, если PGF/TikZ настолько хорош?». Ну, PGF/TikZ, безусловно, отличный инструмент, но PSTricks также может предложить что-то хорошее. Как упоминалось ранее, PSTricks ассоциируется с PostScript, очень мощным языком описания страниц. Мощь программирования, предлагаемая PostScript, делает абсолютно необходимым, чтобы я также представил PSTricks, чтобы потенциальные пользователи могли экспериментировать как с PGF/TikZ, так и с PSTricks, а затем принять обоснованное решение относительно выбора хорошего инструмента визуализации в LaTeX. Итак, в следующей и последней части этой серии, посвященной визуализации научной графики, мы обсудим PSTricks.

Другие статьи о математическом ПО в Linux: