Создание графиков в gnuplot: оформление двухмерных графиков

В этом посте освещается ряд вопросов об оформлении графиков: управление осями, изменение полей и шрифтов графиков, изменение сетки и прочее.

Как построить график фиксированных размеров или задать поля на графике?
Чтобы задать размер графика, следует поправить размеры полей: верхнего (tmargin), нижнего (bmargin), левого (lmargin) и правого (rmargin). По умолчанию размеры полей вычисляются автоматически, однако лично у меня при этом построенные графики с подписями по осям оказываются немного обрезанными снизу. Это легко исправить, задав нижнее поле больше:

gnuplot> set bmargin 4
Размер графика при этом не изменится - просто график несколько сожмётся внутрь.



Как использовать обе стороны оси Y?
Иногда требуется пометить несколько графиков на один. Используя gnuplot, можно оперировать с осями независимо.
По умолчанию, ось Y2 такая же, как и Y. Для примера сделаем их разными, и построим график sin(x) и квадрат этой функии на одном графике. Синтаксис такой: x1y1, x1y2, x2y1, x2y2. Например, axis x1y2 означает, что эта функция будет масштабирована под нижнюю ось Х и правую ось Y.

gnuplot> set xrange [0:2*pi]
gnuplot> set yrange [-1:1]
gnuplot> set y2range [0:1]
gnuplot> plot sin(x) axis x1y1, \
sin(x)**2 axis x1y2

Пример такого графика:
В данном случае деления на правой оси такие же, как и на левой. Чтобы сделать их разными, следует использовать опцию nomirror, установить set ytics и установить set y2tics для того, чтобы деления осей отличались:
gnuplot> set y2tics 0, 0.2
gnuplot> set ytics nomirror
Пример такого графика:
Как стереть одну из осей?
Gnuplot отрисовывает все четыре оси на графике, но иногда требуется сделать так, чтобы некоторые оси не рисовались. Чтобы удалить ненужные оси, следует использовать команду set border n, где n - целое число. Каждая ось имеет приписанное ей число: нижняя ось = 1, левая = 2, верхняя = 4 и нижняя = 8.
Параметр n есть сумма чисел, приписанных осям, которые будут построены.
Так же следует отключить деления осей, которые вы хотите стереть, используя команды set no{x|y}tics или set {x|y}tics nomirror.

Например, если нужно построить график, на котором удалены верхняяи правая оси, нужно написать:
gnuplot> set border 3
gnuplot> set xtics nomirror
gnuplot> set ytics nomirror
Пример такого графика:

Как построить квадратный график или с фикированным отошением сторон?
Чтобы построить кваратный график, следует передать параметр square команде set size например так:
gnuplot> set size square
Вот пример такого графика:
Точно так же, чтобы зафиксировать соотношение сторон, следует написать:
gnuplot> set size ratio 2
В этом случае ось Y будет в два раза длиннее, чем ось X. Это соотношение не зависит от значений, отложенных по осям X и Y. Пример графика:

Как построить ось, проходщую через 0?
Для этого следует использовать команду set {x|y}zeroaxis. По умолчанию, нулевая ось отрисовывается точками, однако это легко переопределяется командами ls line_style, lt line_type, lw line_width. Например, можно сделать так:
gnuplot> set xzeroaxis lt -1
gnuplot> set yzeroaxis

Пример такого графика ниже:


Как избавиться от длинных засечек погрешностей?
Погрешности откладываются при помощи линий, которые кончаются небольшими засечками - и иногда их нунжно отключить. Это достигается при помощи команды
gnuplot> set bar 0
По умолчанию длина равна 1, и если поставить 0, то они исчезнут. Наоборот, увеличивая это число, можно сделать так, чтобы засечки погрешностей стали больше.
gnuplot> set bar 0
Например:

Следует отметить, что при изменении размера точек длина засечек погрешностей не меняется, так что лучше всего поступать так:
gnuplot> set pointsize 3
gnuplot> set bar 3

Как сделать шрифт на графиках больше?
Если вы используете postscript terminal, то можно просто сделать сам график меньше, и буквы увеличатся пропорционально.
gnuplot> set size 0.3,0.3

Приведённая выше команда уменьшает график на 30%.


Как изменить шрифт в легенде, осях и подписях графика?
По умолчанию гнуплот строит графики шрифтом Helvetica и размером 16 пунктов. Время от времени требуется вставлять графики в документы с другими шрифтами, поэтому в скрипте для строительства графиков лучше всего предусмотреть замену шрифтов. Для примера ниже везде будет выставлен шрифт Courier размером 20 пунктов. Делается это следующим образом.

Для того, что сменить шрифт в подписи осей и легенде, нужно дать команду:
gnuplot> set terminal postscript enhanced "Courier" 20
Кавычки в названии шрифта обязательны, дальше через пробел идёт размер шрифта в пунктах.
Теперь меняем шрифт в заголовке графика, передавая параметр font при задании заголовка
gnuplot> set title "Damping Function" font "Times-Roman,40"
Обратите внимание, что здесь синтаксис иной: в кавычках имя шрифта и через запятую его размер.
Осталось заменить шрифт в подписях к осям - это так же осуществляется передачей параметра font при задании метки оси X и Y:
gnuplot> set xlabel "Exposure value, rel. units" font "Courier,20"
gnuplot> set ylabel "Signal mean value" font "Courier,20"
Всё готово, теперь график будет построен с указанными шрифтами.
Пример такого графика:




Как соединить точки графика гладкими кривыми?
Есть возможность соединять точки сплайнами и кривыми Безье при помощи опции smooth. Ниже на примере показывается разиница между кривыми Безье и сплайнами. Одни и те же данные строятся тремя способами: исходные точки данных, соединение кривыми Безье и соеднение сплайнами.

gnuplot> plot "test.dat" using 1:2 notitle with points, \
"test.dat" using 1:2 smooth csplines \
title "spline" with lines,\
"test.dat" using 1:2 smooth bezier \
title "bezier" with lines

Результат на рисунке:


Опция csplines соединияет все точки гладко. С другой стороны, кривые Безье не интерполируют данные, а только сглаживает данные. Пример применения этой опции выглядит так:

gnuplot> plot "test.dat" using 1:2:3 notitle with yerrorbars, \
"test.dat" using 1:2:3 smooth acsplines \
title "acsplines" with lines,\
"test.dat" using 1:2 smooth bezier \
title "bezier" with lines
Такой код преобразуется в график вида:


Для того, чтобы построить аппроксимационную кривую, следует использовать весовой коэффициент для данных. Если весовые коэффициенты одинаковы для всех данных (вес 1.0), следует дополнить команду построения графика using 1:2:(1.0) .



Как построить сетку для промежуточных делений на графике?
Чтобы сетка строилась и для промежуточных делений, указываем:
gnuplot> set grid xtics ytics mxtics mytics
При этом следует внимательно следить за тем, как гнуплот считает промежуточные деления, и если они автоматически определяются неверно, следует их явно указать, например:
gnuplot> set mxtics 5
gnuplot> set mytics 5
И наоборот, если нужно убрать сетку для промежуточных или основных делений, следует использовать команды set grid noxtics noytics mxtics mytics, хотя такие графики применяются редко.



Как построить сетку в нужных местах графика?
Обычно при построении графиков сетка отрисовывается по главным делениям осей. Если требуется отрисовать сетку в заданных позициях, следует использовать команду set tics, как это показано на примере:

In the following example, three tics are displayed at 0.5, 1.2, and 2.5 by the set xtics command.
gnuplot> set xtics ("0.5" 0.5, "1.2" 1.2, "2.3" 2.3)
gnuplot> set grid
Здесь сетка по оси Х будет отрисована в точках 0.5, 1.2 и 2.3, что можно видеть на примере ниже:

Как отобразить на графике значения экспериментальных точек?
Иногда требуется отобразить значения точе
к на графике в виде чисел рядом с точками данных. Гнуплот не может отображать значения данных автоматически, зато этого можно добиться, используя мощь UNIX-way. Например, у нас есть файл данных:

0.40 80
3.00 70
3.00 60
6.00 50
9.00 40
12.00 30
13.00 20
5.00 20
8.00 20

Нужно сгенерировать команды меток, которые и будут отображаться. Выглядят они так:

gnuplot> set label "(0.4,80)" at 0.4,80
gnuplot> set label "(3.0,70)" at 3.0,70

Эти линии можно сгенерировать скриптом на Perl:

% perl -ane 'print "set label \"($F[0],$F[1])\" at $F[0],$F[1]\n"' file.dat > label.plt
Теперь загружаем полученные данные в гнуплот и на построенном графике рядом с каждой точкой будет её значение:
gnuplot> load "label.plt"gnuplot> plot 'file.dat' u 1:2 smooth csp with lines ,\
'file.dat' u 1:2 w points
График выглядит так:



Как оформить график с разным стилем точек данных?
Хочется вместо унылых кружочков и крестиков сделать точки на графике стильными, модными и молодёжными? Нет проблем: в Gnuplot множество стилей оформления точек и линий. Вот какие есть стили для оформления точек:

1 + 2 х
3
* 4
квадратик
5
заполненный квадратик 6
кружочек
7
заполненный кружочек 8
треугольник
9
заполненный треугольник 10 перевёрнутый треугольник
11
заполненный перевёрнутый треугольник 12 алмаз
13
заполненный алмаз 14 пентагон
15 заполненный пентагон 2 ...


Нечётные номера отвечают за закрашенные (наполненные, filled) точки, чётные - за пустые (только контур). Это помогает на графиках различать данные, относящиеся к разным измерениям или процессам.

Оформление графиков разными цветами
Иногда разных стилей точек мало, графики расположены друг к другу очень близко - вот тут нам приходит на выручку цвет. Сначала нужно поправить название терминала в Гнуплоте:

# set terminal postscript solid color eps enhanced 
Далее в стиле линий (linetype) задаём цвет линий так:
set style line 2 lt XXX pt 6 ps 0.1
Вместо
XXX подставляем коды цветов:
1: red
2: green
3: blue
4: magenta
5: cyan
6: yellow
7: black
8: orange
9: gray
Информация к размышлению
О стилях линий, цветах и точках.

13 комментариев: |высказаться!| RSS-лента дискуссии.|
jetxee комментирует...

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

Пример, вначале метка будет отображена в 0,0, а потом будет смещена в 2,0:
gnuplot> set label 1 'tagged label #1' at 0,0
gnuplot> replot
gnuplot> set label 1 'tagged label #1' at 2,0
gnuplot> replot

Без указания номера метки (1) после слова label переместить/удалить помещённую на график метку уже нельзя (точнее можно, но только все метки сразу, unset label)..

Ну и также, где set label, там и set arrow, для рисования стрелок. Во многих графиках они могут быть использованы как «выноски» для подписанных числовых значений, чтобы не мельчить прям поверх кривой.

гриша комментирует...

А как сделать пунктиром график?

virens комментирует...

2 jetxee пишет...

Я бы в разделе про добавление текстовых меток указал, что хотя это и не обязательный параметр, но при интерактивном использовании желательно давать меткам «номер».
Интересная мысль! На выходных, как освобожусь, обязательно дополню. Спасибо, Сергей!

Ну и также, где set label, там и set arrow, для рисования стрелок.
Насчёт стрелок это тоже мысль.

2 гриша пишет...
А как сделать пунктиром график?
Ставьте другой тип линии set style line 1 lt 2 pt 9

ssh комментирует...

А не приходилось ли вам вводить в label'ах греческие символы? Как это сделать?

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

romikt комментирует...

2 ssh:
Некторые терминалы допускают похожее на latex оформление меток. А любимый мной epslatex так вообще допускает произвольный (почти) latex фрагмент внутри меток.

Mihail комментирует...

По поводу автоматического генерирования меток, в gnuplot 4.2 есть такая фича, можно добавить в дата-файл столбец меток и построить их командой:
plot 'data_file' with labels

Denis комментирует...

Вот бы ещё для splot этот "with labels" иметь... %(

Илья комментирует...

Большое спасибо! Даже сохранил web-страничку на диск.

virens комментирует...

Обновил пост, добавил в него информацию о том, какие номера pt что означают (стили оформления точек на графиках). Скоро ещё про цвета добавлю.

Artyom Baloyan комментирует...

как можно задать точку и цвет в конкретных координатах ?

Анонимный комментирует...

Нигде не могу найти, можно ли данные для построения графика брать не из файла, а из массива?

может что знаете по этому поводу?

dasalam комментирует...

Вы имеете ввиду из программы? В C я делаю это при помощи потоков, но можно и воспользоваться специальной библиотекой gnuplot_i

sapog комментирует...

2 dasalam

Пользуюсь использую по работе gnuplot_i.
Скажу честно, будь моя воля, так я бы к нему даже не притронулся, настолько он криво написан.

Отправить комментарий

Подписаться на RSS-ленту комментариев к этому посту.