GNU Plot


gnuplot выдаёт графики с publication-ready качеством, которые принимаются в любом научном журнале. результат работы программы может быть выведен на экран, принтер, конвертирован в растровый или векторный формат (eps, emf, jpg, png, pdf, ps, ...), использован в документах LaTeX и HTML5.

чтобы начать пользоваться данной программой, достаточно её запустить командой терминала "gnuplot", задать функцию, скажем, "f(x) = x*sin(x)", и ввести команду на построение "plot f(x)"

используется командный режим ввода: каждая команда устанавливает какой-то параметр или выполняет заданное действие. команды записываются последовательно, каждая в своей строке, но можно и в одной, используя точку с запятой ";" для разделения. длинные команды можно разбить на несколько строк, предваряя перенос обратным слешем "\"

используются строчные комментарии, начинающиеся со знака "#". важно, чтобы в конце комментария не было знака переноса строки "\"

gnuplot различает числа целые, с плавающей точкой и комплексные. отличием десятичного числа от целого является дробная часть, отделённая точкой. комплексные числа записываютя в фигурных скобках: "{2,3}" эквивалентно записи "2+3i". строчные константы выделяются одинарными или двойными кавычками

есть функция f(x). установить диапазон абсцисс при построении графика можно выражением
plot [x1:x2] f(x)
тогда график будет построен на интервале от x1 до x2

можно ограничить также и диапазон ординат
plot [x1:x2] [y1:y2] f(x)

если же важен только диапазон значений функции
plot [] [y1:y2] f(x)

и не обязательно указывать обе границы интервалов:
plot [x1:] [:y2] f(x)

можно (в последующих командах или ариори) задать диапазон:
set xrange [x1:x2]
set yrange [y1:y2]

чтобы построить в одной системе координат графики нескольких функций просто перечислите их через запятую:
plot f(x), g(x)
когда графиков несколько, становится актуальной "легенда" изображена. она задаётся командой title:
plot f(x) title "curve1", g(x) title "curve2"
задать легенду можно и априори
set title "curve name"

отказаться от легенды:
plot f(x) notitle

подписать оси координат:
set xlabel "x name" - абсцисса
set ylabel "y name" - ордината

установка сетки по осям x и y
set grid xtics ytics

выбор типа линии графика осуществляется командой with (или w)
plot f(x) with lines

доступны следующие типы:

цвет линии можно задать командой linestyle число, а толщину - linewidth число. в первом случае число обозначает цветовой индекс, во втором - толщину в pt

встроенные функции

abs(x) - для комплексного возвращает модуль
sgn(x) - знак числа (+1, -1 или 0)
exp(x) - экспоненциальная зависимость
log(x) - натуральный логарифм x
log10(x) - десятичный логарифм x
sqrt(x) - квадратный корень из x

ceil(x) - наименьшее целое, большее или равное x
floor(x) - наибольшее целое, не больше x

sin(x), asin(x) 
cos(x), acos(x) 
tan(x), atan(x) 
sinh(x), asinh(x) 
cosh(x), acosh(x) 
tanh(x), atanh(x) 

arg(z) - аргумент комплексного числа
imag(z) - мнимая часть числа
real(z) - действительная часть числа

besj0(x), besj1(x) - функции Бесселя j0 и j1, в радианах
besy0(x), besy1(x) - функции Бесселя y0 и y1, в радианах
gamma(x) - гамма-функция

erf(x), erfc(x) - функции ошибок
inverf(x) - обратная функция ошибок
norm(x), invnorm(x) - нормальное распределение и обратная величина
rand(x) - случайное число (при x = 0 - от 0 до 1)

!x - перед переменной означает логическое отрицание x
x! - факториал x
** - возведение в степень
% - остаток от деления
== - тождество
!= - отрицание тождества
<, <=, >=, > - сравнения
&& - логическое "и"
|| - логическое "или"
.  - конкатенация строк
eq - эквивалентность строк
ne - различие строк
state ? var1 : var2 - если state то var1 иначе var2

получить значение функции f(x) в какой-либо точке x0 можно с помощью команды
print f(x0)
например

p = 5; q = 6
g(x) = p * sqrt(x) + q ** 2
print g(4)
выведет значение 46.0

файл с данными размещён в корневом катологе программы. по умолчанию, разделителем служит пробел, хотя данные могут быть разделены и другими знаками, запятой, например. в этом случае нужно использовать команду
set datafile separator ","
где в ковычках указан тип разделителя. график строится:
plot 'sample1.dat'
первый столбец будет служить абсциссой, второй - ординатой, а третий останется проигнорированным. если нас интересует именно столбец "3", нужно сообщит от этом программе с помощью команды using:
plot 'sample1.dat' using 1:($3)
для построения зависимости третьего столбца от второго используется запись
plot 'sample1.dat' using ($2):($3)
(можно вместо "($2):($3)" записать "2:3")
изобразить для каждого x из первого столбца среднее значение столбцов "2" и "3":
plot 'sample1.dat' using 1:($2+$3)/2
можно было записать любую другую функцию: "using 1:sin($2+$3)"
если же функция берётся только от значений второго столбца:
plot 'sample1.dat' thru f(x)
которая означает "plot 'sample1.dat' using 1:(f($2))".

часто требуется применить к графику сглаживание. для этой цели служит команда smooth с параметром, определяющим вид сглаживания. параметры unique и frequency приводят график к виду монотонной зависимости, т.е. исключают ситуации, когда одному x соответствует несколько y. при этом unique находит среднее значение y, а frequency - сумму. в обоих случаях график будет построен ломаными линиями
plot 'sapmle1.dat' smooth unique
сделать график плавным можно с помощью кубических сплайнов (cspline) или кривых Безье (bezier). для сплайна нужно указать веса каждой точки с помощью команды using. их можно задать функционально или прописать в файле данных. в простейшем случае, когда веса одинаковы и равны 1, команда будет выглядеть следующим образом:
plot 'sample1.dat' using 1:2:(1.0) smooth cspline

трёхмерные графики строятся командой splot. каждая строка файла данных должна содержать не две, а три координаты

чтение параметров скрипта из файла

#!/usr/local/bin/gnuplot

a = system ("head -1 line.dat | awk '{print $1}'")
b = system ("head -1 line.dat | awk '{print $2}'")
c = system ("head -1 line.dat | awk '{print $3}'")

f (x, a, b, c) = - a * x / b - c / b

set terminal postscript eps enhanced
set output 'plane_line_distance.ps'
set grid 
  plot [-8:8] f(x, a, b, c)

параметрически заданные функции

для построения графика функции, заданной параметрически:
set parametric
gnuplot сообщит, что для задания кривой зарезервирована переменная t, а для поверхности - u и v

установить диапазон изменения независимой переменной: set trange [begin:end]
begin и end - начало и конец диапазона. график строится командой
plot x(t), y(t) где x(t) и y(t) могут быть заданы заранее либо описаны в самой строке команды

    set parametric
    set trange [-pi:pi]
    plot sin(t*2), cos(t/2)
    set size square
    set yrange [0:1]
  
в примере команда set size square делает одинаковыми длину осей x и y, а set yrange обрезает лишнее по y

для завершения работы в режиме parametric используется команда
unset parametric

полярная система координат

set polar set grid polar

как и в случае параметрически заданных функций, независимой переменной здесь является t, которая соответствует углу относительно оси

    set polar
    set grid polar
    set trange [0:2*pi]
    plot 1-cos(t)
    set size square
  
unset polar - выход из режима работы в полярной системе координат

трёхмерные графики

построение выполняется командой splot:
splot x*y

для работы с осью аппликат зарезервирована переменная z. её диапазон можно задать с помощью:
set zrange
или с испоольованием третьих скобок после имени команды
splot [-100:100] [-100:100] [-100:100] f (x,y)

отобразить границы бокса:
set border 4095

добавить сетку по всем осям:
set grid xtics ytics ztics

включить заливку поверхности цветом:
set pm3d

отображение линий уровня:
set contour surface # команда отображения контура
set view 0,0,1,1 # вид сверху

МНК

есть возможность использовать нелинейный метод наименьших квадратов (МНК) для анализа экспериментальных зависимостей. нужно указать файл с данными, вид искомой зависимости и ввести команду fit

данные в файле могут быть представлены в виде "x y" или "x y s", где x - независимая переменная, y - значение в точке x, s - стандартное отклонение, используемое программой для расчёта "веса" в виде 1/(s **2). для функции двух переменных воспользуйтесь форматом "x y z" или "x y z s" соответственно

искомая зависимость может быть выражена через любые известные Gnuplot функции. в том числе, возможно использование выражений, содержащих условие перехода if

поиск коэффициентов запускается выражением
fit f(x) 'file.dat' via 'coeff.par'
или
fit f(x) 'file.dat' via a, b, c ...
где f(x) - заданная функция, file.dat - файл с данными, coeff.par - файл с начальными значениями параметров функции f(x), а a, b, c - искомые параметры. если значения параметров не заданы, они принимаются равными 1. однако, часто от близости начальных значений к реальным параметрам зависит адекватность решения

если вы разбираетесь в алгоритме Маркарда-Левенберга, Gnuplot готов предоставить вам возможность настроить параметры расчёта. Однако, большинству пользователей будет достаточно двух: FIT_LIMIT - требуемая точность, FIT_MAXITER - максимальное число итераций.

пример: попробуем найти коэффициенты квадратичной зависимости d1 и d2 для массива данных points.dat.

зададим файл начальных значений коэффициентов d.par. теперь нужно запустить gnuplot, записать функцию и воспользоваться командой fit
g(x) = d1*x + d2*x**2
fit g(x) 'points.dat' via 'd.par'
можно было обойтись и без файла d.par, просто задав
fit g(x) 'points.dat' via d1, d2
каждая итерация поиска решения будет отображена программой. построим график:
set xrange [0:3]
plot 'points.dat', g(x)


hotkeys when plot is delivered to the screen:

Ctrl-X u в исходное

Ctrl-X b без границы

Ctrl-X r курсор

Ctrl-X g сетка

Ctrl-X l логарифмическая шкала

Ctrl-X m без инфо положения курсора внизу графика


boxplot

# place a boxplot at x coordinate 1.0 representing the y values in column 5 of 'file.data'
plot 'file.data' using (1.0):5

# same plot but suppress outliers and force the width of the boxplot to 0.3
set style boxplot nooutliers
plot 'file.data' using (1.0):5:(0.3)

by default only one boxplot is produced that represents all "y" values from the second column of the 'using' specification. however, an additional (fourth) column can be added to the specification. if present, the values of that column will be interpreted as the discrete levels of a factor variable. as many boxplots will be drawn as there are levels in the factor variable. the separation between these boxplots is 1.0 by default, but it can be changed by

    set style boxplot separation
  
by default, the value of the factor variable is shown as a tic label below each boxplot
  # suppose that column 2 of ’data’ file contains either "control" or "treatment"
  # the following produces two boxplots, one for each level of the factor
  plot ’data’ using (1.0):5:(0):2
the default width of the box can be set via set "boxwidth <width>" or may be specified as an optional 3rd column in the 'using' clause of the plot command

by default the whiskers extend from the ends of the box to the most distant point whose y value lies within 1.5 times the interquartile range

by default outliers are drawn as circles (point type 7)

examples

#! /home/foo/.nix-profile/bin/gnuplot

set yrange [0:15]
set xrange [0:3]
unset tics
set style fill pattern 5 #transparent 
plot 'twocubes.dat' using (1.0) : 1 : (0.2) with boxplot lc rgb "orange", \
     'cube2.dat' using (2.0) : 1 : (0.2) with boxplot lc rgb "green" 
      # using:   x-coord : column in datafile : width
pause -1

example:

file "file.dat":

Barm 	 12 10 10 11 8 7 12 6 10 11 97
Burj 	 6 7 5 3 9 6 5 7 1 8 57
Dock 	 9 8 8 13 8 13 9 10 14 14 106
Vyte 	 9 11 4 3 6 6 7 8 5 9 68
Yapi 	 1 0 0 0 1 1 0 0 0 1 4
Comm     37 36 27 30 32 33 33 31 30 43 332

script file:

  
#!/home/userOne/.nix-profile/bin/gnuplot

set boxwidth 1 relative
set style data histograms
set style histogram cluster
set style fill transparent solid 0.3 border 
plot for [n=2:11] 'file.dat' u n:xtic(1) lc rgb "#060606" notitle 
pause -1

example:

#set terminal postscript #portrait enhanced mono dashed lw 2
#set output 'vect.ps'
set grid
set xrange [-3 : 3]
set yrange [-3 : 3]
set zrange [-3 : 3]
set xlabel "X"
set ylabel "Y"
set zlabel "Z"
splot "vect.txt" using 1:2:3:4:5:6 with vectors head filled lt 1, \
      "vect.txt" u 4:5:6:0 with labels left
# the second instance is to place a label with coordinates
#   x = column 4 y = column 5 z = column 6 (that is, at the end of your vectors)
# with text = column 0 (which gives the order of your data entries)
# and flush it to the left from those coordinates
pause -1

data file "vect.txt":

0.0 0.0 0.0 1.0 1.0 0.0
0.0 0.0 0.0 1.0 -0.4161468365471424 0.9092974268256817

example:

#! /home/user/.nix-profile/bin/gnuplot

set terminal postscript eps color solid 16
set output "plots/legend.eps"
test

example:

#! /home/user/.nix-profile/bin/gnuplot

set terminal postscript eps color enhanced 
set output "./plots/myplot00.ps"

set xlabel "param {/Symbol a}"  font "DejaVuSansMono-Bold,16"
set ylabel "result {/Symbol b}" font "DejaVuSansMono-Bold,16"

set title "my first plot"

set style line 1 lt 1 pt 6 ps 2
set style line 2 lt 3 pt 1 ps 2 
# 1 2                  (for reference) 
# lt                   linetype
# pt                   pointype 
# ps                   pointsize

set yrange [0:5]
#set grid

plot "./file.data" using 1 title "plot 1" with linespoints lt rgb "#07f" lw 4,\
     "./file.data" using 2 title "plot 2" with linespoints linestyle 1 
# using 1              data file column
# with linespoint      connect points with lines
# lw                   linewidth


#! /home/user/.nix-profile/bin/gnuplot

set terminal postscript eps color solid 22
set output "plots/parametric.ps"
set nokey
set size ratio 0.9
set parametric
tau=100
set samples 1000
plot [0:100] cos(t)*exp(-t/tau), -sin(t)*exp(-t/tau) lt rgb "#00007f" lw 2

в скрипте задаются параметры графика: шрифты осей, пределы по осям, расположение легенды

создаём новый файл и начинаем в него записывать команды - признаком того, что файл относится к скрипту GNuplot, является первая строка в файле:

    #! /usr/bin/gnuplot -persist
выведем график в виде файла формата постскрипт (который можно скормить LaTeX)
    set terminal postscript eps enhanced
задаётся имя выводимого файла с графиком, имя в кавычках
    set output "~/RMSresearch.ps"
ставим поддержку кириллицы
    set encoding koi8r
если кодировку не указывать явно - будет локальная

устанавливаем метки по осям, размер и тип шрифта:

    set xlabel "параметр регуляризациии {/Symbol a}, 10^{-n}" font "Helvetica,18"
    set ylabel "Величина СКО, отн.ед" font "Helvetica,18"
устанавливаем предел значений по оси Y
   set yrange [0:1]
задаём стиль линии (lt - linetype): сплошная прямая с круглыми точками (pt - pointstyle), тип 7
    set style line 1 lt 1 pt 7
строим график, беря данные из файла RMSresult, где мы используем только второй столбец. легенду для данных второго столбца называем СКО (среднеквадратичное отклонение) и заставляем строить график, используя тип линии, который мы задали:
   plot "~/RMSresult" using 2 title "СКО" with linespoints linestyle 1
содержимое файла RMSresult - числа, разделённых пробелами:
  1.0000000e-04 6.1881100e-01
  1.0000000e-03 5.5289577e-01
  1.0000000e-02 3.5527980e-01
  1.0000000e-01 2.4352333e-01
  1.0000000e+00 2.5852181e-01
  1.0000000e+01 2.5291911e-01
  1.0000000e+02 2.5109706e-01
  1.0000000e+03 2.5524945e-01
  1.0000000e+04 2.6013621e-01
  1.0000000e+05 2.4596297e-01
когда у нас есть всё необходимое для строительства графика, в командной строке пишем:
    $ cat simple.graph | gnuplot
людей, работающих в UNIX, должно замкнуть: раз он воспринимает команды потоково - значит, можно gnuplot завернуть в скрипт и заставить штамповать графики массово?

пример. имеются ряды данных в текстовом файле, нужно построить график. вот исходные данные, файл RAWSTDmeasurement

    1.6593991e+00 1.6523134e+00 1.6407763e+00
    1.8986703e+00 1.8667678e+00 1.8595763e+00
    2.6304331e+00 2.5340401e+00 2.4999678e+00
    4.2843754e+00 4.0227936e+00 4.0423230e+00
    7.6136102e+00 7.0438436e+00 7.1057056e+00
нужно построить цветной график, с подписями на осях по-английски, шрифт Helvetica
    #! /usr/bin/gnuplot -persist
    set terminal postscript eps enhanced color solid
    set output "~/matlab/programs/kmvdecoder/plots/1NoiseRAWSTDtoISOnoisecomparing.ps"
    set xlabel "ISO number" font "Helvetica,18"
    set bmargin 4
    set ylabel "Pixels standard deviation" font "Helvetica,18"
    set yrange [0:50]
    set key top left
    set xtics ("100" 0,"200" 1,"400" 2,"800" 3,"1600" 4)
    set style line 1 lt 1 pt 9
    set style line 2 lt 3 pt 7
    set style line 3 lt 2 pt 5
    plot "~/plots/RAWSTDmeasurement" \
         using 1 title "RAW data, Red channel" with linespoints \
         linestyle 1,"~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult" \
         using 2 title "RAW data, Green channel" with linespoints linestyle 3, \
         "~/plots/RAWSTDmeasurement" using 3 title "RAW data, \
         Blue channel" with linespoints linestyle 2
команда set устанавливает параметры построения графика

команда plot строит график.

всего-то навсего - две команды и немного параметров к ним

пример

#! /usr/bin/gnuplot -persist

set terminal postscript eps enhanced color solid
# устанавливает постскрипт-вывод, расширенный - можно использовать греческие символы,
# цветной - графики будут цветными

set output "~/matlab/programs/kmvdecoder/plots/1NoiseRAWSTDtoISOnoisecomparing.ps"
# это путь к будущему графику и имя графика

set xlabel "ISO number" font "Helvetica,18"
# подпись по оси Х будет "ISO number", шрифтом Helvetica и размером 18 пунктов.

set bmargin 4
# устанавливаем нижнее поле равное 4 относительным единицам,
# чтобы не обрезалась подпись к оси Х (косяк имеет место быть у меня, у вас его может и не быть)

set ylabel "Pixels standard deviation" font "Helvetica,18"
# подпись по оси Y будет "Pixels standard deviation", шрифтом догадайтесь каким :-)

set yrange [0:50]
# пределы по оси Y составляют от 0 до 50

set key top left
# легенда (обозначение рядов данных) сверху слева

set xtics ("100" 0,"200" 1,"400" 2,"800" 3,"1600" 4)
# отсчёты по оси Х будут 100, 200, 400 800 и 1600.

set style line 1 lt 1 pt 9
set style line 2 lt 3 pt 7
set style line 3 lt 2 pt 5
# задаётся номер линии (чтобы на неё сослаться при построении конкретного ряда данных),
# тип линии и тип точки (квадратик, кружочек, ромбик...).

plot "~/plots/RAWSTDmeasurement" using 1 title "RAW data, \
      Red channel" with linespoints linestyle 1,
      "~/plots/RAWSTDmeasurement" using 2 title "RAW data, \
      Green channel" with linespoints linestyle 3,
      "~/plots/RAWSTDmeasurement" using 3 title "RAW data, \
      Blue channel" with linespoints linestyle 2

# вся эта конструкция предписывает строить график, который будет состоять
# из трёх линий (типа 1, 2 и 3). график строится по данным, которые лежат в одном текстовом файле
# заголовок у каждой ветви графика разный, он задаётся после title, а слово using означает,
# что в файле несколько столбцов данных: для первой ветви - первый столбик,
# для второй ветви - второй столбик и так далее.
# для каждой ветви графика задаётся свой стиль линии.

использование обеих вертикальных осей, но с разными подписями

мы будем строить два массива данных на одном графике, но подписи на оси Y с двух сторон будут разные.

оси означают разные, хотя и взаимосвязанные, данные. вот код для графика:

 #! /usr/bin/gnuplot -persist
 set terminal postscript "NimbusSanL-Regu" eps color enhanced \
      fontfile "/usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb"
 set output "./plots/threshold_sparsity.ps"
 set key bottom right
 set xtics 10
 set mxtics 10
 set ytics 10 
 set mytics 10 
 
 set yrange [60:100]
 set y2range [60:100] 
 set xrange [10**-5:1]
 set style line 1 lt 1 pt 6 ps 1.2
 set style line 2 lt 1 pt 9 ps 1.4
 set logscale x 
 set format x "10^{%L}"  
 set grid xtics ytics mxtics  
 
 set y2tics 5
 set xlabel  "Threshold value for the matrix" font "NimbusSanL-Regu,18"
 set ylabel  "Matrix sparsity, \% percentage" font "NimbusSanL-Regu,18"
 set y2label "Output disturbance attenuation, \% percentage" font "NimbusSanL-Regu,18"
 plot ".data" using 6:8 title "Percentage of sparsity of the Hessian matrix" with points \
 linestyle 1  lc rgb "blue" axis x1y1 ,
ключевые для понимания строки:
 set y2range [60:100] 
 set y2tics 5 
 set y2label "Output disturbance attenuation, \% percentage" font "NimbusSanL-Regu,18" 
здесь используется довольно редкий финт: изменение поведения второй вертикальной оси y2range в гнуплоте. Да-да, она не просто так отсвечивает в графике и её тоже можно использовать. В данном случае мы явно указываем диапазон значений для второй оси set y2range [60:100] проставляем на ней другие засечки с помощью set y2tics 5
и далее присваиваем оси другую (независимую) подпись set y2label

Обратите внимание на параметры команды на строчках 23-24: мы строим два ряда данных и указываем, какие оси использовать. Сначала это axis x1y1 а потом axis x1y2 для того, чтобы два массива данных строились относительно двух разных осей

три графика один под другим

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

в строительстве подобных графиков нам поможет инструкция set multiplot
в gnuplot. вот как выглядит код для этого графика:

#! /usr/bin/gnuplot -persist
 set terminal postscript "NimbusSanL-Regu" eps color enhanced \
    fontfile "/usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb"
 set output "./plots/plotOutputDisturbancePlant.ps"
 set lmargin 10 
 set rmargin 2 
 set grid
 set bmargin 4

 set style line 1 lt 1 pt 5 ps 0.3
 set style line 2 lt 2 pt 7 ps 0.5
 set style line 3 lt 3 pt 9 ps 0.3
 set style line 4 lt 4 pt 11 ps 0.3
 set style line 5 lt 5 pt 13 ps 0.3

 set xrange [300:600]

 set multiplot
 set nokey 
 set size 1,0.35 
 set xlabel "Sampling instant" 
 set ylabel "Control input" 
 set origin 0.0,0.0
 set bmargin 3
 set tmargin 0
 plot "./data.data" index 23 using 3 title " " with linespoints  linestyle 1  lc rgb "red",
      "./data.data" index 22 using 3 title " " with linespoints linestyle 2 lc rgb "dark-red",
      "./data.data" index 18 using 3 title " " with linespoints linestyle 3 lc rgb "dark-green",
      "./data.data" index 14 using 3 title " " with linespoints linestyle 4 lc rgb "blue",
      "./data.data" index 12 using 3 title " " with linespoints linestyle 5 lc rgb "green"
 set ylabel "Output disturbance" 

 set size 1,0.3 
 set origin 0.0,0.39  
 set xlabel " " 
 set bmargin 0 
 set tmargin 1
 set nokey 
 plot "./data.data" index 23 using 2 title " " with linespoints linestyle 1 lc rgb "red",
      "./data.data" index 22 using 2 title " " with linespoints linestyle 2 lc rgb "dark-red",
      "./data.data" index 18 using 2 title " " with linespoints linestyle 3 lc rgb "dark-green",
      "./data.data" index 14 using 2 title " " with linespoints linestyle 4 lc rgb "blue",
      "./data.data" index 12 using 2 title " " with linespoints linestyle 5 lc rgb "green"

 set size 1,0.3 
 set origin 0.0,0.7 
 set bmargin 0.1 
 set xlabel " " 
 set tmargin 1
 set ylabel "Residual disturbance" 
 plot "./data.data" index 23 using 1 title " " with linespoints linestyle 1 lc rgb "red",
      "./data.data" index 22 using 1 title " " with linespoints linestyle 2 lc rgb "dark-red",
      "./data.data" index 18 using 1 title " " with linespoints linestyle 3 lc rgb "dark-green",
      "./data.data" index 14 using 1 title " " with linespoints linestyle 4 lc rgb "blue",
      "./data.data" index 12 using 1 title " " with linespoints linestyle 5 lc rgb "green"
 set nomultiplot
до строки 17 всё в общем вполне очевидно - задаём стили для линий разных типов, диапазоны на осях и сетку. строка 2 явно указывает гнуплоту внедрять шрифты

чёрная магия начинается дальше: с помощью инструкци set multiplot на строке 17 мы просим строить gnuplot несколько графиков на одном

график начинаем строить с конца, то есть с нижнего графика. для этого мы меняем размер и позицию графика:

 set size 1,0.35 
 set origin 0.0,0.0
 set bmargin 3
 set tmargin 0
на строках 17-22. после этих танцев с бубном строим график:

plot "./data.data" index 22 using 3 title " " with linespoints  linestyle 1  lc rgb "red"

из файла данных ./data.data, используя блок с результатами номер 23 (ибо index 22 а нумерация идёт с блока 0), в котором строим 3-ю колонку (using 3) стилем линий linestyle 1 используя красный цвет линии lc rgb "red"

вообще полезно продумать структуру данных для строительства графиков заранее. например, размещать данные для разных случаев блоками (ряды данных, отбитых двумя пустыми строками), чтобы использовать возможности gnuplot и особенно инструкции index. график, расположенный в середине (строки 32-43 ), строится точно так же, только:

set size 1,0.3 
set origin 0.0,0.39
ну и наконец верхний график в примере это строки 44-54, после чего выключаем multiplot и скармливаем всё gnuplot для графопостроительства. всё легко и просто :-)

графики с осями, имеющими разрывы

разрывные оси (broken axis) на графиках иногда нужны, чтобы показать данные только в тех значениях, где происходит что-то интересное. при этом масштаб нужен линейный, а применение логарифмических осей нежелательно или невозможно (например, когда показывается probability density function). и если вы думали, что предыдущий пример мозговыносящий - пристегните ремни!

требуется построить простой график, но чтобы оси были разрывные
код для построения графика:

reset
set term png font "Times,15"
set output "broken_axes1.png"
f(x)=exp(-x)*sin(500*x)     #plotting function
set yrange [-1:1]    #The later two plot have same yrange
set sample 400
set tics nomirror
set tmargin at screen 0.9   #the later two plots will share this tmargin
set bmargin at screen 0.1   #------------------------------------b------

set multiplot    #begin multiplot mode

#axes broken line
set arrow 1  from screen 0.5,0.08 to screen 0.52,0.12 nohead
set arrow 2  from screen 0.52,0.08 to screen 0.54,0.12 nohead
set arrow 3  from screen 0.5,0.88 to screen 0.52,0.92 nohead
set arrow 4  from screen 0.52,0.88 to screen 0.54,0.92 nohead

#x,y axis label and title label
set label 1 "Time: t(s)" at screen 0.475,0.025
set label 2 "Signal:U(mV)" at screen 0.025,0.44 rotate by 90
set label 3 center "U=exp(-t)sin(500t)" at screen 0.5,0.95

#The left part
set border 1+2+4    #the right border is not plotted
set lmargin at screen 0.1   #the left-part's location
set rmargin at screen 0.51
set xtics 0,0.02,0.08
plot [0:0.1] f(x) w l lt 1 lw 2 notitle

#unset the labels and arrows, otherwise they will be plot 
#for the second time
unset label 1
unset label 2
unset label 3 

unset arrow 1
unset arrow 2
unset arrow 3
unset arrow 4

#the right part
set border 1+4+8    #the left border is not plotted
set lmargin at screen 0.53      #the right-part's location
set rmargin at screen 0.94
#ytics is not plotted, as the second plot will share it with the first one
unset ytics
set xtics 0.9,0.02,1.0
plot [0.9:1] f(x) w l lt 1 lw 2

unset multiplot
выглядит, конечно, устрашающе. тем не менее, это тот же самый set multiplot только сбоку. в отличие от предыдущего примера, здесь мы строим левую и правую части графиков отдельно, с разными осями и диапазонами, а потом сшиваем вместе

новизна тут в засечках на осях, которые строятся с плачем и рыданиями - реально, это самая сложная и занудная часть графика (строки 13-17):

#axes broken line
set arrow 1  from screen 0.5,0.08 to screen 0.52,0.12 nohead
set arrow 2  from screen 0.52,0.08 to screen 0.54,0.12 nohead
set arrow 3  from screen 0.5,0.88 to screen 0.52,0.92 nohead
set arrow 4  from screen 0.52,0.88 to screen 0.54,0.92 nohead 
занудность в том, что угадать координаты засечек (в формате [x,y]_начало_засечки, [x,y]_конец_засечки) довольно непросто

далее идёт построение левой части (строки 24-29):

#The left part
set border 1+2+4    #the right border is not plotted
set lmargin at screen 0.1   #the left-part's location
set rmargin at screen 0.51
set xtics 0,0.02,0.08
plot [0:0.1] f(x) w l lt 1 lw 2 notitle
сложность здесь в том, чтобы угадать с полями ( set lmargin и set rmargin ) - угадывание может отнять время
после убираем засечки:
#unset the labels and arrows, otherwise they will be plot 
#for the second time
unset label 1
unset label 2
unset label 3 

unset arrow 1
unset arrow 2
unset arrow 3
unset arrow 4
и строим левую часть:
#the right part
set border 1+4+8    #the left border is not plotted
set lmargin at screen 0.53      #the right-part's location
set rmargin at screen 0.94
#ytics is not plotted, as the second plot will share it with the first one
unset ytics
set xtics 0.9,0.02,1.0
plot [0.9:1] f(x) w l lt 1 lw 2

выключаем мультиплот unset multiplot и вставляем эффектный график в статью

три графика в одном с разрывными осями

вот как выглядит график:
здесь показано время работы алгоритма для трёх случаев. в одном из случаев (верхний) время распределено очень неравномерно, и нужно не просто отобразить три графика, но и сделать это с разрывными осями, которые к тому же имеют разный масштаб

код для графика:

#! /usr/bin/gnuplot -persist
  
 set terminal postscript "NimbusSanL-Regu" eps color  \
     enhanced fontfile  "/usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb"
 set output "./decoupled.ps"
 set lmargin 10 
 set rmargin 2 
 set grid
 set bmargin 4

 set multiplot
 set xrange [0.16:0.22]
 set yrange [0:2000]
 set xtics 0.005 
 set grid
 set key top left
 set size 1,0.35 
 set xlabel "Mean computation time, milliseconds" 
 set origin 0.0,0.0
 set bmargin 3
 set tmargin 0
 plot ".data" using ($2*10**3):1 title "No coupling, DM with 4 actuators" \
        with boxes fs pattern 2  lc rgb "blue" 
 set ylabel "Frequency of occurrences (out of 4000 data points)" 


 set size 1,0.3 
 set origin 0.0,0.39  
 set bmargin 0 
 set tmargin 1
 set xtics 0.1 
 set xrange [0.2:1.7]
 set yrange [0:130]
 set xlabel "" 
 set grid
 set key top left
 plot ".data"  using ($2*10**3):1 title "No coupling, DM with 49 actuators" \
      with boxes fs pattern 1 lc rgb "dark-red"


 set xtics 0.5 
 set size 1,0.3 
 set origin 0.0,0.7 
 set bmargin 0.1 
 set tmargin 1
 set xrange [0:8]
 set xlabel "" 
 set ylabel "" 
 set arrow 3  from screen 0.52,0.98 to screen 0.50,0.94 nohead
 set arrow 4  from screen 0.57,0.98 to screen 0.55,0.94 nohead
 set arrow 1  from screen 0.52,0.72 to screen 0.50,0.68 nohead
 set arrow 2  from screen 0.57,0.72 to screen 0.55,0.68 nohead
 set border 1+2+4 
 set lmargin at screen 0.1 
 set rmargin at screen 0.51 
 set xtics 0.1 
 set yrange [0:80]
 plot [0.3:1.5] ".data" using ($2*10**3):1 title "No coupling, DM with 100 actuators" \
        with boxes fs pattern 5 lc rgb "dark-green"
 unset arrow 1
 unset arrow 2
 unset arrow 3
 unset arrow 4 
 set border 1+4+8  
 set lmargin at screen 0.56   
 set rmargin at screen 0.975
 set nokey
 set xtics 0.05 
 set yrange [0:1000]
 plot [7:7.5] ".data" using ($2*10**3):1 title " " with boxes fs pattern 5 lc rgb "dark-green"
 set nomultiplot
Собственно, здесь объёдинены два предыдущих примера. Только вместо точек строятся гистограммы, на что намекает строчка with boxes fs pattern 5 для команды plot.

Строчки 45-52 прямо вытащены из примера про разрывные оси.

Обращаю внимание на то, что в коде наличествуют странные на первый взгляд инструкции вида set xlabel " " они тут совершенно не случайно: при таком строительстве графиков подписи на осях будут красть ценное место, так что лучше спроектировать график так, чтобы оси были одна под другой.

Выражение
plot [7:7.5] ".data" using ($2*10**3):1
тоже требует пояснений: это на самом деле один из самых простых примеров пред-обработки данных перед строительством графика. Здесь мы просим умножить данные в столбце 2 в тысячу раз: $2*10**3 . Если приглядеться графику, то ось Х содержит данные в милисекундах, но сняты данные были в долях секунды. Удобнее умножить их в гнуплоте, чем пытаться переделать потом.

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


gnuPlot for Haskell

assuming you are a Haskeller, you can get a simply x-y plot up very quickly with the gnuplot interface module. this is useful for getting a rough graphical view of some function

cabal install gnuplot
...   
$ ghci
ghci> import Graphics.Gnuplot.Simple
ghci> plotFunc [] (linearScale 1000 (-20, 20)) (\x -> sin x / x)

you can change the x-range from (-20, 20) to whatever you prefer

if you want a plot of a points list:

    ghci> plotList [] [(2,10),(3,15),(4,14),(5,19)]

in both cases the empty list just means use the default plot attributes script file

data Aspect = Ratio Double | NoRatio
  
data Attribute
  = Custom String [String]
  | EPS FilePath
  | PNG FilePath
  | Terminal gnuplot-0.5.5.1:Graphics.Gnuplot.Private.Terminal.T
  | Grid (Maybe [String])
  | Key (Maybe [String])
  | Border (Maybe [String])
  | XTicks (Maybe [String])
  | YTicks (Maybe [String])
  | Size Size
  | Aspect Aspect
  | BoxAspect Aspect
  | LineStyle Int [LineAttr]
  | Title String
  | XLabel String
  | YLabel String
  | ZLabel String
  | XRange (Double, Double)
  | YRange (Double, Double)
  | ZRange (Double, Double)
  | Palette [(Double, (Double, Double, Double))]
  | ColorBox (Maybe [String])
  | XTime
  | XFormat String

data Attribute3d
  = Plot3dType Plot3dType | CornersToColor CornersToColor

data CornersToColor
  = Mean
  | GeometricMean
  | Median
  | Corner1
  | Corner2
  | Corner3
  | Corner4

data LineAttr
  = LineType Int
  | LineWidth Double
  | PointType Int
  | PointSize Double
  | LineTitle String

data LineSpec = DefaultStyle Int | CustomStyle [LineAttr]

data Plot3dType = Surface | ColorMap

data PlotStyle
  = PlotStyle {plotType :: PlotType, lineSpec :: LineSpec}

data PlotType
  = Lines
  | Points
  | LinesPoints
  | Impulses
  | Dots
  | Steps
  | FSteps
  | HiSteps
  | ErrorBars
  | XErrorBars
  | YErrorBars
  | XYErrorBars
  | ErrorLines
  | XErrorLines
  | YErrorLines
  | XYErrorLines
  | Boxes
  | FilledCurves
  | BoxErrorBars
  | BoxXYErrorBars
  | FinanceBars
  | CandleSticks
  | Vectors
  | PM3d

data Size = Scale Double | SepScale Double Double

defaultStyle :: PlotStyle

epspdfPlot :: FilePath -> ([Attribute] -> IO ()) -> IO ()

inclPlot :: FilePath -> ([Attribute] -> IO ()) -> IO String

plotDots ::
  (Graphics.Gnuplot.Value.Atom.C a,
   Graphics.Gnuplot.Value.Tuple.C a) =>
  [Attribute] -> [(a, a)] -> IO ()

plotFunc ::
  (Graphics.Gnuplot.Value.Atom.C a,
   Graphics.Gnuplot.Value.Tuple.C a) =>
  [Attribute] -> [a] -> (a -> a) -> IO ()

plotFunc3d ::
  (Graphics.Gnuplot.Value.Atom.C x, Graphics.Gnuplot.Value.Atom.C y,
   Graphics.Gnuplot.Value.Atom.C z, Graphics.Gnuplot.Value.Tuple.C x,
   Graphics.Gnuplot.Value.Tuple.C y,
   Graphics.Gnuplot.Value.Tuple.C z) =>
  [Attribute]
  -> [Attribute3d] -> [x] -> [y] -> (x -> y -> z) -> IO ()

plotFuncs ::
  (Graphics.Gnuplot.Value.Atom.C a,
   Graphics.Gnuplot.Value.Tuple.C a) =>
  [Attribute] -> [a] -> [a -> a] -> IO ()

plotList ::
  Graphics.Gnuplot.Value.Tuple.C a => [Attribute] -> [a] -> IO ()

plotListStyle ::
  Graphics.Gnuplot.Value.Tuple.C a =>
  [Attribute] -> PlotStyle -> [a] -> IO ()

plotLists ::
  Graphics.Gnuplot.Value.Tuple.C a => [Attribute] -> [[a]] -> IO ()

plotListsStyle ::
  Graphics.Gnuplot.Value.Tuple.C a =>
  [Attribute] -> [(PlotStyle, [a])] -> IO ()

plotMesh3d ::
  (Graphics.Gnuplot.Value.Atom.C x, Graphics.Gnuplot.Value.Atom.C y,
   Graphics.Gnuplot.Value.Atom.C z, Graphics.Gnuplot.Value.Tuple.C x,
   Graphics.Gnuplot.Value.Tuple.C y,
   Graphics.Gnuplot.Value.Tuple.C z) =>
  [Attribute] -> [Attribute3d] -> [[(x, y, z)]] -> IO ()

plotParamFunc ::
  (Graphics.Gnuplot.Value.Atom.C a,
   Graphics.Gnuplot.Value.Tuple.C a) =>
  [Attribute] -> [a] -> (a -> (a, a)) -> IO ()

plotParamFuncs ::
  (Graphics.Gnuplot.Value.Atom.C a,
   Graphics.Gnuplot.Value.Tuple.C a) =>
  [Attribute] -> [a] -> [a -> (a, a)] -> IO ()

plotPath ::
  Graphics.Gnuplot.Value.Tuple.C a =>
  [Attribute] -> [(a, a)] -> IO ()

plotPathStyle ::
  Graphics.Gnuplot.Value.Tuple.C a =>
  [Attribute] -> PlotStyle -> [(a, a)] -> IO ()

plotPaths ::
  Graphics.Gnuplot.Value.Tuple.C a =>
  [Attribute] -> [[(a, a)]] -> IO ()

plotPathsStyle ::
  Graphics.Gnuplot.Value.Tuple.C a =>
  [Attribute] -> [(PlotStyle, [(a, a)])] -> IO ()

terminal ::
  gnuplot-0.5.5.1:Graphics.Gnuplot.Private.Terminal.C term =>
  term -> Attribute

linearScale :: Fractional a => Integer -> (a, a) -> [a]