Оформление научных результатов: интеграция LaTeX и Gnuplot

    «Если ваш единственный инструмент — молоток, то каждая проблема становится похожей на гвоздь»

    Абрахам Маслоу


    Введение


    Научное творчество само по себе процесс не тривиальный, требующий некоторого отрешения от внешнего мира. И нелинейный в плане распределения интенсивности во времени — порой проболтаешься впустую полгода, чтобы потом, в течение месяца-полутора решить большую часть беспокоящих тебя вопросов.

    И вот, ты на 100% использовал возможности посетившей тебя «эврики», закончил основную работу и пришла пора опубликовать свои результаты в журнале, доложить их на конференции, да и просто порадовать своего научного руководителя/консультанта красивым отчетом. И ты приступаешь к мучительной фазе оформления статьи/доклада/отчета. И насколько мучительной будет эта фаза, зависит от того, какие инструменты ты решил использовать для этой работы.

    Вспоминаю времена, когда молодым и глупым аспирантом, я писал первый вариант кандидатского «кирпича», предназначенный для тщательного «вычитывания» мной и моим научным руководителем. Тогда я не знал о формате EPS, а поэтому экспортировал графики, построенные в Maple в *.bmp-растр и вручную… обводил их в MS Visio для последующей вставки в Word. Были и другие, не менее топорные глупости. Не удивительно, что тогда я проклял всё, и дал себе слово следующую диссертацию писать совершенно по другому.

    Путем последовательных итераций, на сегодняшний день я пришел к такому вот решению:



    И настало время отдать накопленный опыт людям. Интересующимся, добро пожаловать под кат.

    1. Gnuplot: что такое и с чем едят


    Думаю, я не открою Америку, и читатель знаком с данной утилитой. Чтобы долго не рассказывать о ней, я приведу ряд ссылок, прежде всего на официальный сайт проекта, понижающие порог вхождения «Записки дебианщика», а так же весьма полезный ресурс с многочисленными примерами, ну и весьма неплохо оформленный FAQ на русском языке. Это поможет быстро войти в курс дела, тем, кто ещё не пробовал данный инструмент в работе.

    Если коротко — Gnuplot — мощная утилита для построения графиков, заданных аналитическими зависимостями, таблично (экспериментальные данные и данные численного моделирования), поддерживающая командный режим работы и написание скриптов. Пользователям Linux достаточно установить пакет из репозиторя своего дистрибутива, пользователи Windows и OS X тоже могут установить данную утилиту, руководствуясь инструкцией на официальном сайте. Я же буду излагать, всё запланированное к изложению, на примере Linux.

    Набираем в командной строке:
    $ gnuplot
            G N U P L O T
            Version 4.6 patchlevel 6    last modified September 2014
            Build System: Linux x86_64
    
            Copyright (C) 1986-1993, 1998, 2004, 2007-2014
            Thomas Williams, Colin Kelley and many others
    
            gnuplot home:     http://www.gnuplot.info
            faq, bugs, etc:   type "help FAQ"
            immediate help:   type "help"  (plot window: hit 'h')
    
    Terminal type set to 'qt'
    gnuplot>
    

    Получая приглашение к вводу команд. Вводим, ну, например:

    plot x**3 title 'Кубическая парабола y = x^3'
    

    И получаем:



    Когда я увидел это впервые, я тоже сказал «Фууу...!» Это результат, полученный по умолчанию, и выглядит он как-то не солидно. Так никто не мешает его доработать. Прежде всего изменим цвет и толщину линии графика.

    gnuplot> set style line 1 lt 1 lw 3 lc rgb '#4682b4' pt -1
    plot x**3 title 'Кубическая парабола y = x^3' ls 1
    

    Сделаем «школьные» оси, с точкой пересечения в начале координат, рисованные сплошными линиями

    gnuplot> set xzeroaxis lt -1
    gnuplot> set yzeroaxis lt -1
    gnuplot> replot
    

    Добавим сетку — пунктирные линии серого цвета:

    gnuplot> set grid xtics lc rgb '#555555' lw 1 lt 0
    gnuplot> set grid ytics lc rgb '#555555' lw 1 lt 0
    

    Перенесем метки оси к самим осям поближе:

    gnuplot> set xtics axis  
    gnuplot> set ytics axis  
    

    Изменим диапазон изменения аргумента:

    gnuplot> set xrange [-3:3]
    

    И в конечном итоге получим вот это:



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

    2. Gnuplottex: интеграция графиков в документы LaTeX


    Gnuplottex — пакет, входящий в поставку TeXlive, позволяющий вводить команды Gnuplot прямо в верстаемом документе. Не отвлекаясь на теоретизирование, приступим непосредсвенно к практике. Создадим новый документ

    \documentclass[12pt]{article}
    
    % Подключаем всяко-разное, задаем кодировку, язык и прочие параметры по вкусу
    \usepackage[OT1,T2A]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage[english,russian]{babel}
    \usepackage{amsmath,amssymb,amsfonts,textcomp,latexsym,pb-diagram,amsopn}
    \usepackage{cite,enumerate,float,indentfirst}
    \usepackage{graphicx,xcolor}
    
    % Порядку для задаем размер полей страницы, дальше это нам пригодится
    \usepackage[left=2cm, right=2cm, top=2cm, bottom=2cm]{geometry}
    
    % Включаем Gnuplottex
    \usepackage{gnuplottex}
    
    \begin{document}
    
    \section{Построение графиков Gnuplot в документе \LaTeX}
    
    \end{document}
    

    ВНИМАНИЕ! Сборка документа должна выполнятся с ключем -shell-escape, включающим возможность выполнения команд оболочки, либо так:

    $ pdflatex -shell-escape gnuplottex_rus.tex
    

    Либо задать этот ключик в настройках IDE (у меня это Kile):



    Теперь, в теле документа будем ваять наш график:

    \begin{figure}[h]
     \centering
     \begin{gnuplot}
      plot x**3 title 'Кубическая парабола $y = x^3$'
     \end{gnuplot}
    \end{figure}
    

    После сборки получая:



    Заметили что тут самое «вкусное»? Формула в подписи к графику выглядит по-человечески — вся мощь LaTeX в вашем полном распоряжении. А теперь допилим это дело напильничком:

    \begin{figure}[h]
     \centering
     \begin{gnuplot}
      set terminal epslatex color size 12cm,15cm
      set xzeroaxis lt -1
      set yzeroaxis lt -1
      set style line 1 lt 1 lw 4 lc rgb '#4682b4' pt -1
      set grid ytics lc rgb '#555555' lw 1 lt 0
      set grid xtics lc rgb '#555555' lw 1 lt 0
      set xrange [-3:3]
      plot x**3 title '$y = x^3$' ls 1	
     \end{gnuplot}
    \end{figure}
    


    Особо отметим команду:

    set terminal epslatex color size 12cm,15cm
    

    Задающую тип терминала: EPS LaTeX с поддержкой цветного вывода; и его размер 12 х 15 см — ваш рисунок и есть этот терминал. В итоге получаем график



    Слегка изменим код, добавив еще один стиль линий и график:

      set style line 2 lt 1 lw 4 lc rgb '#aa0000' pt -1  
      .
      .
      .
      plot x**3 title '$y = x^3$' ls 1, \  
           x**4 title '$y = x^4$' ls 2
    




    Видно, что нет принципиальной сложности в использовании рассматриваемой технологии. Можно добавить сюда же и трехмерный график:

    \begin{figure}[h]
     \centering
     \begin{gnuplot}
      set terminal epslatex color size 12cm,12cm
      splot x**2 + y**3 with lines title '$z = x^2 + y^3$'
     \end{gnuplot}
     \caption{Трехмерный график сеткой}
    \end{figure}
    




    Изменяем схему отображения с сетки на цветные полигоны:

    splot x**2 + y**3 with pm3d title '$z = x^2 + y^3$'
    



    Настройку внешнего вида, выбор палитры — всё это можно почерпнуть из документации к Gnuplot, а мы переходим к следующему пункту программы

    3. Построение графиков из файлов данных


    В этом главная мощь данного инструмента. Пусть у вас имеется текстовый файл с данными, сформироваными следующим образом:

    #  x  y1 y2  
    0  0  0
    1  1  1
    2  4  8
    3  9  27
    4  16 64
    

    Первая колонка, например аргумент, вторая и третья — значения некоторых функций. Это может быть результат натурного эксперимента, или результат численного моделирования. Построение двухмерного графика будет выглядеть так:

    plot '<имя файла с данными>' using <колонка аргумента>:<колонка функции> title '<легенда>'
    

    Колонки нумеруются начиная с единицы. Дабы не было скучно, приведу пример из своих документов. Создам в папке с данным учебным проектом каталог results/ и помещую туда файл с результатами численного эксперимента 2319.log (тут своя специфика именования логов...). Затем добавлю в наш проект такой код:

    \begin{figure}
      \centering
      \begin{gnuplot}
       set terminal epslatex color size 17cm,8cm
       set xzeroaxis lt -1
       set yzeroaxis lt -1
       set xrange [0:20]
       set style line 1 lt 1 lw 4 lc rgb '#4682b4' pt -1 
       set style line 2 lt 1 lw 4 lc rgb '#ee0000' pt -1 
       set style line 3 lt 1 lw 4 lc rgb '#008800' pt -1
       set style line 4 lt 1 lw 4 lc rgb '#888800' pt -1
       set style line 5 lt 1 lw 4 lc rgb '#00aaaa' pt -1
       set style line 6 lt 1 lw 4 lc rgb '#cc0000' pt -1
       set grid xtics lc rgb '#555555' lw 1 lt 0
       set grid ytics lc rgb '#555555' lw 1 lt 0
       set xlabel '$t$, c'
       set ylabel '$P$, кН'
       set key bottom right   
       plot 'results/2319.log' using 1:3 with lines ls 2 ti '$P_2$', \
    	'results/2319.log' using 1:9 with lines ls 4 ti '$P_9$', \
    	'results/2319.log' using 1:19 with lines ls 5 ti '$P_{19}$',\
    	'results/2319.log' using 1:29 with lines ls 1 ti '$P_{29}$',\
    	'results/2319.log' using 1:49 with lines ls 3 ti '$P_{49}$', \
    	'results/2319.log' using 1:54 with lines ls 6 ti '$P_{53}$'	
      \end{gnuplot}
      \caption{Продольные силы в различных сечениях поезда}
    \end{figure} 
    




    Команда:

    set key bottom right 
    

    Помещает легенду в правый нижний угол поля графика, чтобы она не мешалась сверху и справа. Кроме того, команды Gnuplot и их параметры можно сокращать до степени однозначного трактования написания, как в этом примере: ti => title.

    А теперь представьте себе, что вы сверстали диссертацию, но в последний момент вам понадобилось подставить другие результаты тех же самых измерений. Не надо переверстывать графики — подмените файл результатов и пересоберите проект. Всё! Ваша верстка никуда не денется. Пять минут дела, если изменение данных не ведет к далеко идущим научным выводам.

    И последнее — если вы помещаете график на слайд Beamer, то окружение слайда должно содержать опцию fragile, иначе вас ждет ошибка компиляции. Вот так:

    \begin{frame}[fragile]
    %
    % Содержимое слайда
    %
    \end{frame}
    


    Заключение


    Изучение вопроса заняло у меня весь вчерашний вечер. Презентацию пришлось верстать уже ночью, но я успел и сегодня успешно доложится (отчет по первому году докторантуры). В душе осталось теплое ощущение от возможности открытых технологий, помогающих в научном труде. По какому пути идти, каждый выбирает для себя сам. Статья носит обзорный характер и освещает только вопросы необходимые для быстрого старта. Остальное легко можно почерпнуть из документации.

    Документ, созданный в примере, можно забрать здесь

    Успехов в научном труде, и спасибо за внимание к моему.
    Метки:
    Поделиться публикацией
    Комментарии 25
    • –3
      Прежде чем использовать этот подозрительный gnuplottex, советую заглянуть в его внутренности и понять суть работы. Есть у меня подозрения, что он каждую компиляцию заново строит графики, что неприемлемо.
      А вот если он создает директорию, куда накидывает pdf-файлы с графиками только при первой компиляции или при изменении содержимого окружения gnuplot, то можно и использовать.
      Но я все равно не вижу в этом особого смысла. Разве что построение ежемесячных отчетов с кучей графиков по показаниям за месяц (т.е. make подготавливает, скажем, на основе данных в БД, файлы для гнуплота, а затем «в один присест» мы компилируем файл и строим графики), т.е. тот вариант, когда и пакет fp рационально использовать.
      • 0
        А вот если он создает директорию, куда накидывает pdf-файлы с графиками только при первой компиляции или при изменении содержимого окружения gnuplot, то можно и использовать.


        Создает pdf файлы. И eps файлы создает. В директории проекта
      • +2
        Я использую для этого tikz. Достаточно мощный пакет с большими возможностями.
        • +1
          Ну, всё-таки это разные вещи. tikz отличен для создания иллюстраций — всяких схемок и прочее. А gnuplot нужен, чтобы строить именно графики функций или, что реалистичнее, всяких данных, вместе с error-bar'ами и прочее. Оба инструмента важны.
          • +4
            скорее всего имелся ввиду не сам tikz, а его макрорасширение pgfplots.
        • +5
          Мой коллега однажды написал очень неплохой, как мне кажется, сборник советов и рецептов про latex. Там есть про microtype, оформление библиографии и другое. Вероятно, читателям этой статьи тоже будет интересно.

          Кроме того, мне кажется, на рисунках можно поправить некоторые вещи: (1) расстояния между «коробкой» рисунка (черным квадратом), подписями к осям и значениями на осях можно делать значительно меньше. (2) Расстояния «коробка-числа на осях» и «числа на осях-подписи к рисунку» можно сделать одинаковыми или соразмерными (сейчас вторые намного больше первых). (3) Подписи лучше выравнивать по «коробке», а не по всей ширине/высоте рисунка (коробке + подписям осей). (4) На трехмерном рисунке значения налазят на ось и друг на друга. (5) Кроме того, минимальное значение по оси z можно сделать намного меньше. (6) Еще я заметил, что нынче в западных физических журналах почти никогда не рисуют сетку (даже в логарифмических шкалах), просто оставляют ticks на осях—видимо, чтоб не захламлять рисунок и не отвлекать внимание.
          • +1
            На всякий случай упомяну, что в Papeeria (онлайн редактор и компилятор латеха) встроена возможность быстро построить средствами гнуплота график или гистограмму по данным, взятым из файла или клипборда. На выходе получается standalone PDF, встраиваемый в основной файл, выглядит он симпатично, в метках можно использовать латех, и вдаваться в тонкости программирования гнуплота (а он все таки не самый дружественный к ошибкам) почти не нужно. Особо продвинутые же пользователи могут запускать полноценные гнуплот скрипты и строить сложные графики.

            • +1
              В своё время тоже мучился со стилями для Gnuplot, но в итоге перешёл на GLE.
              • 0
                Тоже очень интересно, не знал про него. Стянул мануал с сайта, на досуге попробую
                • 0
                  Это штука, которая уже боле двух лет остановилась в развитии?
                • 0
                  Подскажите пожалуйста хорошую документацию по LaTeX на Русском.
                  • +2
                    Книга Львовского покрывает 99,9% потребностей
                    • 0
                      Если нужна именно документация, а не учебник, обратите внимание на мануалы Сюткина: «Справочник по командам LaTeX2», «Набор математических формул в LaTeX2», «Русский язык в LaTeX», «Цвет в LaTeX», «Включение рисунков в LaTeX2», «Гипертекст в LaTeX».
                    • +1
                      А кто-нибудь может поделиться опытом использования подобного, но для построения графиков в R?
                      • +1
                        Да, в R достаточно просто печатать на графиках математические символы.

                        Взято здесь

                        Под тэгом код и результат.
                        x < — seq(-4, 4, len = 101)
                        y < — cbind(sin(x), cos(x))
                        matplot(x, y, type = «l», xaxt = «n»,
                        main = expression(paste(plain(sin) * phi, " and ",
                        plain(cos) * phi)),
                        ylab = expression(«sin» * phi, «cos» * phi), # only 1st is taken
                        xlab = expression(paste(«Phase Angle », phi)),
                        col.main = «blue»)
                        axis(1, at = c(-pi, -pi/2, 0, pi/2, pi),
                        labels = expression(-pi, -pi/2, 0, pi/2, pi))

                        Приводит к вот такому результату


                        Было время, R автоматически распознавал latex в подписях и текстах на графиках, но и нынешний вариант неплохо смотрится.

                        Я печатаю из R в pdf, а pdf вставляю в latex документ.
                      • +2
                        Прикольно. Я когда делал работы в LaTeX'е, использовал Makefile'ы.

                        По команде make сначала отрисовываются графики (если исходные файлы были изменены) и складываются в отдельную папочку в pdf (или eps — не помню уже), потом собирается LaTeX-документ, в который в нужных местах подключаются эти самые графики. И так же само, кстати, и svg-графика собиралась: inkscape'ом в пакетном режиме в pdf, а потом подключалась в проект. В итоге одной командой собиралась вся работа (очень выручало, когда надо было перед сдачей на коленке что-то исправить).

                        Если кому-то такой метод пригодится — пользуйтесь на здоровье ;)
                        • 0
                          Спасибо!
                          Makefile'ы, как показывает практика, вообще замечательная штука.
                          • 0
                            Поддерживаю. С Makefile на мой вкус получается более unixway: нет привязки к специфическому расширению LaTeX, можно подвязать любой внешний генератор графиков или преобразование входных данных, явно видны все зависимости между файлами в проекте.
                          • 0
                            Вот основная беда таких инструментов — у них нет заранее заготовленных вариантов оформления как правило. Получишь пару раз страшный дефолт и пойдёшь искать альтернативу.
                            За статью спасибо большое. Забрал в избранное.
                            • +2
                              Неплохо.
                              Но такого же результата можно добиться с заметно меньшими усилиями, если воспользоваться Python + NumPy + Matplotlib.
                              Кроме того, за счет использования NumPy можно более гибко манипулировать данными.
                              • +1
                                Причём Python + NumPy + Matplotlib это не только посторитель графиков, но ещё и мощный язык для написания всего что угодно. Но это затягивает, я сначала на нём стоил графики из сишной проги, а потом полностью перешел на питон в расчётах :)
                              • 0
                                Я бы упомянул таки классические TikZ и PGF. Я читал каменты — вот буквально пример www.texample.net/tikz/examples/gnuplot-basics/
                                И я бы упомянул, что gnuplot ещё и сам умеет делать выход на LaTeX.

                                Кстати, интересный академический вопрос — конвертор формул LaTeX вот в то, что gnuplot понимает (я так понимаю FORTRAN-формат). Я не смог найти.
                                • 0
                                  А я использую R-пакеты knitr и ggplot2. Это просто сказка какая-то. Можно все вычисления и построения графиков делать прямо в LaTeX-документе (лучше, конечно, выносить в отдельные файлы скриптов). Скажем, есть у меня какие-то исходные данные для задачки, я на их основе чего-нибудь рассчитываю и рисую графики. Поменялись исходные данные — все расчётные значения пересчитались, графики красиво перерисовались. ggplot2 обладает определённым порогом вхождения, но если научиться им пользоваться, то красивые визуализации для статьи перестают быть проблемой.
                                  • 0
                                    Испольузю Gnuplot с выводом результата в TikZ для пострения сложных графиков, основанных на экспериментальных данных, и непосредсвенно TikZ для построения простых графиков.

                                    Например простой график выглядит так:
                                    \begin{tikzpicture}
                                    % АЧХ RC-цепочки
                                    \draw[-latex] (0,0) -- (4,0) node [anchor=west] {$\omega$}; % оси
                                    \draw[-latex] (0,0) -- (0,3) node [anchor=south] {$K(\omega)$};
                                    \draw[domain=0:3,y=2cm, x=1cm,smooth] plot function{1/(1+x**2)**0.5}; % график
                                    \end{tikzpicture}
                                    


                                    Как-то раз нужно было постоянно перестраивать графики, если добавились новые файлы данных. Решил эту задачу скриптом на баше, который смотрел есть ли новые файлы с данными и генерировал скрипт Gnuplot, который в свою очередь генерировал TikZ, которые подставлялись в отчёт.
                                    • 0
                                      Добавил в статью ссылку на создаваемый в ней документ. Для полноты описания

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.