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]
можно указать количество необходимых образцов:
set samples 500
чтобы построить в одной системе координат графики нескольких функций просто перечислите их через запятую:
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))"
трёхмерные графики строятся командой splot. каждая строка файла данных при этом должна содержать не две, а три координаты
часто требуется применить к графику сглаживание. для этой цели служит команда 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
#!/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
пример:
#! /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
set polar set grid polar
как и в случае параметрически заданных функций, независимой переменной здесь является t, которая соответствует углу относительно оси
set polar set grid polar set trange [0:2*pi] plot 1-cos(t) set size squareunset 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)
Ctrl-X u в исходное
Ctrl-X b без границы
Ctrl-X r курсор
Ctrl-X g сетка
Ctrl-X l логарифмическая шкала
Ctrl-X m без инфо положения курсора внизу графика
# 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)
#! /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
в скрипте задаются параметры графика: шрифты осей, пределы по осям, расположение легенды
создаём новый файл и начинаем в него записывать команды - признаком того, что файл относится к скрипту 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 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"
вообще полезно продумать структуру данных для строительства графиков заранее. например, размещать данные для разных случаев блоками (ряды данных, отбитых двумя пустыми строками), чтобы использовать возможности 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 . Если приглядеться графику, то ось Х содержит данные в милисекундах, но сняты данные были в долях секунды. Удобнее умножить их в гнуплоте, чем пытаться переделать потом.
Усвоенный урок лично автором этих строк: такие мозговыносящие графики стоит создавать поэтапно - сначала нижний график, потом средний, потом верхний. Так проще отлавливать ошибки в инструкциях гнуплоту.
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]