Побудова графіків в LaTeX/PGFPlots

image

Дана стаття присвячена опису роботи з пакетом PGFPlots, розробленого для популярної настільної видавничої системи LaTeX. Однак, навіть якщо ви не знайомі з останньою, це не привід засмучуватися і кидати читання цієї статті, адже, можливо, ті чудові приклади, які будуть далі наведено, і надзвичайна потужність і зручність PGFPlots надихнуть вас на вивчення LaTeX.

Введення і мотивація

Існує велика кількість різних систем для побудови графіків і візуалізації даних. Звичайно, не можна сказати, що PGFPlots може замінити їх усі (наприклад, при роботі з середовищем R іноді зручніше покластися на її власний механізм побудови графіків і просто додавати побудовані графіки в документ зображення), однак існує і певна значна ніша, в якій застосовувати його зручно: навчальні матеріали; різні звіти, які будучи студентами, напевно робили все в тій чи іншій мірі; найпростіша візуалізація даних і т. п.

Нижче показані приклади, які не тільки підтверджують сказане, але і показують, що можливості цієї системи часто навіть перевершують наші повсякденні вимоги до такого роду системам (клацніть на зображення, щоб переглянути вихідний прикладу):




Стаття не претендує на роль вичерпного керівництва по PGFPlots, оскільки з такою роллю успішно справляється офіційна документація, на яку надалі часто зустрічатимуться посилання), швидше її роль в тому, щоб познайомити читачів з цією системою і хоч трохи розкрити основні її можливості. Висловлюю надію, що з цим завданням дана стаття впорається, а так це чи ні, вирішувати вам, читачам.

Для роботи з прикладами потрібен встановлений дистрибутив LaTeX. На жаль, його установка і настройка виходять за рамки даної статті, тому ті, хто не хоче возитися з його установкою і налаштуванням, але хочуть поекспериментувати з можливостями, описаними тут, можуть спробувати такі онлайн-сервіси, як Overleaf і ShareLaTeX.

Отже, почнемо!

Підключення пакета

Для підключення PGFPlots досить додати в преамбулу документа команду:
\usepackage{pgfplots}

Після цього пакет буде завантажений і встановлено. Проте якщо ж у вас з тих чи інших причин не відбувається, то слід звернутися до документації (стор 11), де докладно розписані різні способи встановлення даного пакету.

Крім того, слід звернути увагу на те, що PGFPlots проектувався з розрахунку на зворотну сумісність, і проекти, створені з використанням старих версій даного пакету будуть відкриватися і відображатися без змін, незалежно від того, наскільки нова версія коштує у вас. Проте в пакет, тим не менш, вносяться зміни, які порушують зворотну сумісність і для того, щоб їх підключити, необхідно в преамбулі прописати явним чином версію (у прикладі нижче вказана версія 1.9):
\pgfplotsset{compat=1.9}

Основи побудови графіків

Розглянемо спочатку найпростіший приклад побудови графіка і на ньому пояснимо призначення основних компонентів, з яких складається практично будь-який графік у PGFPlots:

image
%Преамбула
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

%Вміст документа
\begin{document}
\begin{tikzpicture}
\begin{axis}[
title = Exponenta,
xlabel = {$x$},
ylabel = {$y$},
minor tick num = 2
]
\addplot[blue] {e^x};
\end{axis}
\end{tikzpicture}
\end{document}

Оточення tikzpicture
Оскільки PGFPlots базується на основі TikZ (це ще один чудовий пакет, призначений для створення графічних зображень в LaTeX), то будь-графік розміщується у відповідному оточенні tikzpicture даного пакету.
\begin{tikzpicture} ... \end{tikzpicture}

Слід зазначити, що така тісна зв'язок TikZ і PGFPlots — це великий плюс, оскільки вона дозволяє, по-перше, дуже добре інтегрувати графіки в різні малюнки, виконані в TikZ, а також, навпаки, використовувати можливості TikZ при роботі з графіками (див. наочний приклад).

Оточення, яке встановлює осі графіка
Далі, всередині зазначеного вище оточення, розміщується ще одне оточення, що визначає осі графіка. Нижче в таблиці наведені основні види таких середовищ:
Тип оточення Призначення
axis Стандартні осі з лінійним масштабом
semilogxaxis Логарифмічний масштаб осі x і стандартне масштабування осі y
semilogyaxis Логарифмічний масштаб осі y і стандартне масштабування осі x
loglogaxis Логарифмічний масштаб обох осей
Зазвичай багато налаштування відображення графіків зазначаються у властивостях даного оточення (в прикладі вище вказаний заголовок title, назва підписи до осі абсцис xlabel, назва підпису осі ординат ylabel і кількість додаткових, у тому сенсі, що вони не підписуються — поділок між основними minor tick num). При цьому слід розуміти, що опції можуть бути вказані не тільки таким чином (локально), але також і більш глобально, наприклад, за допомогою стилів або шляхом додавання в преамбулу документа рядки, як показано в прикладі нижче:
\pgfplotsset{title = Undefined chart}

Таких властивостей — превелика безліч, вони дозволяють налаштувати практично будь-який аспект зовнішнього вигляду графіка і всі вони перераховані в керівництві. Наведемо для прикладу нижче список найбільш типових для даного оточення властивостей:
Властивість Призначення значення
width, height Встановлюють ширину і висоту графіка відповідно
domain = min max Встановлює область значень функції в діапазоні від min max
xmin, xmax Встановлюють мінімальне і максимальне значення на осі абсцис відповідно
ymin, ymax Встановлюють мінімальне і максимальне значення на осі ординат відповідно
xlabel, ylabel Встановлюють підпис до осі абсцис і осі ординат відповідно
view Встановлює поворот камери, при цьому властивість зазначається наступним чином view = {{}{кут піднесення}; при цьому азимут — це кут між положенням камери і віссю z, а кут піднесення — це кут між положенням камери і віссю x.
grid Вказує тип сітки major — лінії сітки проходять тільки через основні ділення, minor — лінії сітки проходять через додаткові поділу (між основними), both — лінії сітки проходять через обидва види ділень, none — сітка відсутня [стандартний]
colormap Встановлює використовувану колірну схему hot, hot2, jet, blackwhite, bluered, cool, greenyellow, redyellow, violet та інші, створені користувачем
Додавання графіка
Нагадаємо, що в розглянутому прикладі графік додавався за допомогою команди addplot, у якій в якості основного параметра була вказана функція, чий графік був побудований, і колір даного графіка:
\addplot[blue] {e^x};

Використана команда addplot (для двовимірного графіка) і її аналог addplot3 (для тривимірного графіка) є найбільш поширеним засобом для того, щоб створити графік. Загальний формат цієї команди наступний:
\addplot[<options>] <input data> <trailing path commands>;

Опції <options> є необов'язковим параметром, в яких зазначаються: тип графіка, його колір, стиль, тип маркерів і т. п.

Вхідні дані <input data> визначають на підставі чого будується графік, у прикладі в якості вхідних даних була вказана функція, однак, як буде показано далі, вибір вхідних даних набагато ширше.

Як невеликий підсумок
Отже, підведемо невеликий підсумок нашого знайомства з PGFPlots.

  1. Всі графіки розміщуються в оточення tikzpicture:
    \begin{tikzpicture} ... \end{tikzpicture}

  2. Для відображення графіка, необхідно створити оточення, що визначає тип використовуваних осей в ньому, наприклад, axis:
    \begin{axis} ... \end{axis}

  3. Потім усередині створеного оточення додаються графіки найчастіше за допомогою команд \addplot \addplot3:
    \addplot[<options>] <input data> <trailing path commands>; 

Вхідні дані

Не маючи ніякого бажання, дублювати написане документації (стор 40 — 63) і викладати всі тонкощі роботи з вхідними даними, ми зупинимося на розгляді основних засобів в найбільш загальному вигляді, і наведемо ряд прикладів їх пояснюють.

Побудова графіків на основі математичного виразу
Загальний вигляд команди побудови графіка на основі математичного виразу повинен бути вже знайомий:
\addplot[<options>] {math_expression} <trailing path commands>; 

Для обробки математичного виразу використовується вбудований аналізатор, який має достатній близький синтаксис до багатьох систем комп'ютерної алгебри, і тому робота з ним не представляє особливої складності. Повний список математичних операторів і функцій можна знайти в цьому документі (стор 933). Частину з них для складання загального враження наведена нижче.
Оператор Призначення
+ Оператор додавання
- Оператор віднімання
* Оператор множення
/ Оператор ділення
^ Оператор зведення в ступінь
mod Оператор взяття залишку
! Постфиксный оператор обчислення факторіала
<, >, ==, <=, >= Оператори порівняння
Функція Призначення
abs Функція взяття модуля
sin, cos, tan, asin, acos, atan Основні тригонометричні функції та зворотні їм
ln, log2, log10 Натуральний, двійковий і десятковий логарифми
deg Функція перетворення радіан в градуси (вона особливо корисна, якщо врахувати, що за замовчуванням розглянутий парсер працює саме з градусами, а не радіанами)
Після того, як математичний вираз буде оброблено, фактично, буде побудовано безліч точок (кількість цих точок можна змінити за допомогою властивості графіка samples), на основі яких буде побудовано той чи інший графік. Як ілюстрація сказаного, нижче наведені однакові графіки з різним значенням властивості samples:


Нижче наведено приклад побудови 3D графіка на основі математичного виразу:
image
%Преамбула
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

%Вміст документа
\begin{document}
\begin{tikzpicture}
\begin{axis}[ 
view={110}{10}, 
colormap/greenyellow,
colorbar 
]
\addplot3[surf] {-sin(x^2 + y^2)};
\end{axis}
\end{tikzpicture}
\end{document}

Зауважте, що тут використовувалася раніше не згадана команда colorbar , яка додає шкалу, яка встановлює відповідність між кольором і значенням функції.

Побудова графіків на основі введених координат
Цей спосіб набагато простіше, ніж попередній та передбачає, що користувач просто вкаже список впорядкованих пар (x,y) (для двовимірного графіка) або (x,y,z) (для тривимірного графіка) і на їх основі згодом буде побудований графік.
\addplot[<options>] coordinates {<coordinate list>} <trailing path commands>

Відразу розглянемо приклад:
image
%Преамбула
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

%Вміст документа
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot coordinates {
(0,1) (2,4) (7,8) (10,15)
};
\end{axis}
\end{tikzpicture}
\end{document}

Зверніть увагу на те, що впорядковані пари просто розділяються пробілами без використання яких-небудь спеціальних символів-розділювачів.

Побудова графіків на основі таблиці
Побудова графіків на основі таблиці є одним з найпоширеніших і зручних способів побудови різних графіків.
\addplot table [<column selection>] {(file or inline table)}.

В першу чергу, визначимо основні принципи роботи з таблицями:
  1. Рядка поділяються символи переходу на новий рядок. Для використання в ролі символу \\ необхідно встановити наступну властивість:
    table/row sep = \\
    
  2. Стовпці зазвичай розділяються пробілами або символами табуляції. Встановити цю роль для інших символів можна за допомогою наступного властивості:
    table/col sep = space|tab|comma|colon|semicolon|braces|&|ampersand
    
  3. Будь-яка рядок, що починається з # або % буде проігнорована
Приклад коректної таблиці наведено нижче:
a b c
1 1 1
2 3 4
3 5 5
4 8 6
5 2 7

Параметр <column selection> визначає відповідність між певною віссю (або джерелом мета-інформації, про яку ми трохи скажемо пізніше) і стовпцем, причому відповідність задається по першій сходинці таблиці, що наочно видно на прикладах далі.

Побудова графіка на основі вбудованої таблиці (inline)
image
%Преамбула
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

%Вміст документа
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot3 table [x = b, y = a, z = c] {
a b c
1 1 1
2 3 4 
3 5 5 
4 8 6
5 2 7
};
\end{axis}
\end{tikzpicture}
\end{document}


Побудова графіка на основі таблиці в зовнішньому файлі
Розглянемо практичний приклад. наступного посилання лежить файл .csv, в якому містяться дані про демографічну ситуацію в Росії (РРФСР) приблизно за століття її історії.

image
%Преамбула
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

%Вміст документа
\begin{document}
\begin{tikzpicture}
\begin{axis}[
table/col sep = semicolon,
height = 0.6\paperheight, 
width = 0.65\paperwidth,
xmin = 1927,
xmax = 2014,
/pgf/number format/1000 sep={}
]

\addplot table [x={Year}, y={Average population}] 
{RussianDemography.csv};
\end{axis}
\end{tikzpicture}
\end{document}

Природно, що це далеко не всі способи, і поки що за межами нашого розгляду залишилося взаємодії PGFPlots з іншими додатками (наприклад, GNUPlot), використання скриптів при побудові графіків, впровадження зовнішньої графіки і т. п.

Налаштування графіків

Тепер, коли ми розібралися з тим, як можуть виглядати вхідні дані для графіка, пора приділити увагу тому, як налаштувати графіки, зробити їх більш зрозумілими і наочними.

Легенда графіка
Легендою називається підпис, пояснюючий те, що зображено на графіку. Особливо корисно використання легенди, коли у нас є кілька різних графіків.

Для опис легенди можна використовувати команду \legend{...}, усередині якої через кому перераховуються опису графіків (PGFPlots визначає відповідність між описом і графіком за порядком слідування описів і порядку додавання самих графіків).
image
%Преамбула
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

%Вміст документа
\begin{document}
\begin{tikzpicture}
\begin{axis} [
legend pos = north west, 
ymin = 0, 
grid = major
]
\legend{ $\ln(x)$, 
$\log_2(x)$, 
$\log_{10}(x)$
};
\addplot {log2(x)};
\addplot {ln(x)};
\addplot {log10(x)};
\end{axis}
\end{tikzpicture}
\end{document}

У прикладі в легенді вказані математичні вирази, на основі яких будуються дані графіки, але, взагалі, там може бути довільний текст.

Крім того, в ньому використовувалося властивість legend pos, яке дозволяє вказати положення легенди на графіку (south west, south east, north west, north east, outer north east ).

Користувальницькі стилі
Розглянемо найпростіший приклад: у нас в документі прийнято, щоб графік, що відображає експериментальні дані, виділена червоним кольором, а графік функції, що відображає графіки математичної моделі, мав синій колір. Так було прийнято рівно до тих пір, поки у видавництві нам не сказали, що вони приймають тільки чорно-білі статті і, відповідно, зовнішній вигляд графіків необхідно змінювати, і в рамках великого документа — це складне і важке завдання.

Тому набагато краще в таких ситуаціях описати стилі в одному місці документа і потім їх застосовувати до графіків. Для створення користувацьких стилів відома нам команда \pgfplotsset з наступними аргументами:
\pgfplotsset{<style_name>/.style={<key-value-list>}};


Відразу розглянемо приклад, аналогічний тому, про який ми говорили раніше:
image
%Преамбула
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

%Налаштування стилів
\pgfplotsset{model/.style = {blue, samples = 100}}
\pgfplotsset{experiment/.style = {red}}

%Вміст документа
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin = 0, ymax = 125]
\addplot[model]{e^(x)};
\addplot[experiment] table {
x y
1.5 0.1
1.3 2.1
2.7 12.2
3.5 25.6
4.1 57.0
5.3 121.6
};
\end{axis}
\end{tikzpicture}
\end{document}

Маркери
Маркери — це, якщо говорити в загальних рисах, точки на графіку. Ознайомитися з докладним списком різних видів стандартних маркерів можна документації (стор 160).

Як і завжди, коштів для їх налаштування дуже багато, навіть в документації, на яку ми посилаємося, описані не всі з них. Розглянемо найбільш типові способи налаштування.

Вибір типу маркера виконується за допомогою наступного властивості:
mark = <type_of_marker>

Налаштування трьох основних параметрів (розміру, кольору заливки маркера і його контуру) може бути виконана за допомогою наступного властивості:
mark options={scale = <relative_scaling>, fill = <color> draw = <color>

Заздалегідь встановлених кольорів дуже багато, але завжди можна додати свій, наприклад, за допомогою наступної команди:
\definecolor{<name_of_color}{rgb}{..., ..., ... }

Розглянемо приклад:
image
%Преамбула
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\definecolor{chucknorris}{rgb}{192,0,0}

%Вміст документа
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[
mark = *, 
mark options = {
scale = 1.5, 
fill = pink, 
draw = chucknorris
}
]{x^2};
\end{axis}
\end{tikzpicture}
\end{document}

Лінії графіка і їх колір
Коли ми раніше говорив про чорно-білому графіку для видавництва, напевно, кожен з вас згадав, що одним із способів відрізняти один графік від іншого є виділення одного пунктиром, а іншого суцільною лінією. Все це, природно, можна зробити тут.

З усіма стилями ліній (в першу чергу різними видами пунктирних ліній) можна ознайомитися документації (стор 165). Встановлюються вони за допомогою вказівки явно назви стилю в опціях, наприклад, графіка.

Товщина лінії графіка налаштовується за допомогою властивості line width:
line width = <width_of_line>

Колір лінії графіка налаштовується за допомогою властивості draw:
draw = <color>


%Преамбула
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

%Вміст документа
\begin{document}
\begin{tikzpicture}
\begin{axis}[
domain=0:1, 
legend pos = north west
]
\legend{$e^x$, $1 + x + x^2/2$}
\addplot[dashed, draw = blue]{e^x};
\addplot[solid, draw = red]{1 + x + x^2/2};
\end{axis}
\end{tikzpicture}
\end{document}


Приклади деяких типів 2D-графіків

За замовчуванням будь-який двовимірний графік являє собою лінійний графік (для явного вибору цього типу, необхідно вказати в опціях додається графіка властивість sharp plot). Фактично, цей тип графіка просто з'єднує зазначені точки прямою лінією. Однак насправді типів двомірних графіків набагато більше і вони описані в документації (стор 75 — 114).

Далі ми розглянемо для прикладу ряд інших типів графіків, які часто доводиться використовувати на практиці.

Гістограма
Для створення гістограми існують два типу графіка: горизонтальна гістограма, яка відповідає властивості xbar, і вертикальна гістограма, яка відповідає властивості ybar.

Нижче наведено приклад створення вертикальної гістограми, що відображає регіональну структуру зарахованих на бюджетні місця в 2010-2014 рр. в ВШЕ:
image
%Преамбула
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
%Вміст документа
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar,
width = 250pt,
/pgf/number format/1000 sep={},
legend style={
at={(0.5,-0.25)},
anchor=south,
legend columns=-1
}
]
\addplot coordinates {
(2010, 34) (2011, 39) (2012, 39) 
(2013, 36) (2014, 32.6) 
};
\addplot coordinates {
(2010, 12) (2011, 11) (2012, 14) 
(2013, 12) (2014, 10.7) 
};
\addplot coordinates {
(2010, 54) (2011, 50) (2012, 47) 
(2013, 52) (2014, 56.7) 
};
\legend{Moscow, Moscow region, Other regions}
\end{axis}
\end{tikzpicture}
\end{document}


Графік розсіювання
Графік розсіювання — це гучна назва для графіка, який містить в собі тільки маркери, іншими словами, він являє собою безліч точок на графіку. Для вибору даного типу графіка використовується властивість only marks.

Розглянемо відразу практичний приклад: у нас є таблиця, перші два стовпці якої відображають двовимірні координати точки а третій — приналежність до одному з трьох кластерів. Необхідно побудувати графік, який би відображав з одного боку положення точок у просторі, а з іншого їхня приналежність до того чи іншого кластера.

%Преамбула
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

%Вміст документа
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[
mark=halfcircle*,
mark size=3pt,
only marks,
point meta=explicit symbolic,
scatter,
scatter/classes={
a={blue}, 
b={red}, 
c={black} 
}]
table [meta=class] {
x y class
1 4 a
1 2 a
0 3 a
0 2 a 
5 6 b
5 5 b
4 5 b
5 7 b 
9 9 c
};
\end{axis}
\end{tikzpicture}
\end{document}

Перше, на що варто звернути увагу, так це на те, що у властивостях таблиці ми вказуємо «стовпець» meta, в результаті чого обрана колонка class відповідає за деякі мета-властивості елемента таблиці.

Потім, в параметрах вказується зовнішній вид маркерів, що раніше ми робили, а потім використовується команда point meta, яка показує PGFPlots, де і як йому брати мета-інформацію.
point meta = none|<math_expression>|x|y|z|f(x)|explicit|explicit symbolic

Докладніше можна прочитати в документації (стор 185), зупинимося лише на тому, що було вибрано значення explicit symbolic, що означає, що мета-дані беруться з того стовпця, який прописаний у властивостях таблиці, причому саме як символи, а не числа.

Ну і, нарешті, було зазначено чудове властивість scatter, що включає зміну зовнішнього вигляду маркерів залежно від їх координат або приналежності до того чи іншого кластера. В парі з ним використовується властивість scatter/classes, що визначає те, як повинен змінюватися зовнішній вигляд маркера в залежності від приналежності до того чи іншого кластера.

Підбиваючи підсумки

Отже, стаття підійшла до кінця, і спасибі всім, хто дочитав до сюди. Я прекрасно віддаю собі звіт, що тут була розглянута лише вершина айсберга, лише частина тих можливостей, які надає нам PGFPlots, і, звичайно, за межею розгляду залишилося дуже багато цікавих і корисних речей. Але, сподіваюся, тим не менш, стаття виконала своє завдання: познайомити і зацікавити.

Сміливо висловлюйте свої побажання щодо того, що ви б хотіли бачити в такий вступної статті, може бути щось було упущено або, навпаки, десь щось було розглянуто надто детально.

Література та посилання для подальшого вивчення

image1. Основним та найнадійнішим джерелом інформації за даного пакету є згадувана раніше масивна офіційна документація.
2. Велика кількість прикладів можна знайти на сайті PGFPlots.net, а також тут.
3. На велику кількість питань, пов'язаних з PGFPlot, відповіді були отримані тут.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.