Показаны сообщения с ярлыком гнуплот. Показать все сообщения
Показаны сообщения с ярлыком гнуплот. Показать все сообщения

Как втиснусть много данных в график gnuplot



12 коммент.
Собственно, этот пост есть коллекция трюков, которая набралась в процессе подготовки двух последних конференций. Проблема в том, что нужно вместить много данных в небольшой график, и делается это порой весьма нетривиальным образом. Как известно, с помощью gnuplot можно сделать всё, что угодно, но мало кто знает как именно. Демонстрация чёрной магии в стиле Gnuplot с полным разоблачением ниже.

Читать далее

График в Gnuplot с условиями: conditional data plotting in Gnuplot



19 коммент.
Как известно, одна картинка стоит тысячи слов. Вместо длинного и занудного изложения лучше привести график и его прокомментировать. Сложность в том, что иногда в график нужно запихнуть много данных, и дизайн графика превращается в самостоятельную задачу. Одна из таких задач - построение точек на графике в зависимости от условий (conditional data plotting).

Читать далее

Внедрение шрифтов в графики Gnuplot



20 коммент.
Как всегда, беда пришла, и её совсем не ждали. Организаторы конференции SPIE, в которой я заядлый участник, что-то там поменяли в своей системе приёма PDFников статей. Теперь система Numbus Roman не переваривает, и заменяет его чудовищным Courier. Вопрос о внедрении английских шрифтов в графики, созданные gnuplot, встал в полный рост. Летопись героической победы приложенных титанических усилий прилагается.
Читать далее

Как построить графики с погрешностями в gnuplot по экспериментальным данным



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

Для того, чтобы указать gnuplot строить графики с погрешностями, строка с командой plot в скрипте должна содержать директиву with errorbars:
  • погрешности откладываются для данных по оси Х: with xerrorbars
  • погрешности откладываются для данных по оси Y: with yerrorbars
  • погрешности откладываются для данных по обоим осям: with xyerrorbars
Величину погрешности можно посчитать для каждой точки (в зависимости от эксперимента, например, при измерениях на разных пределах) и сделать для этого в файле данных test.dat данных отдельную колонку:
#  X     Y     dX    dY
1.0 1.2 0.8 1.5
2.0 1.8 0.3 2.3
3.0 1.6 1.0 2.1


В этом случае, чтобы построить график с погрешностями по оси Y, например, последняя команда в скрипте для графика будет выглядеть так:
gnuplot> plot "test.dat" using 1:2:3 with yerrorbars
Общая идея, думаю, понятна: сначала указываются колонки, содержащие данные, а потом колонки, содержащие значения погрешностей. Таблица, любезно утянутая отсюда, даёт прекрасную иллюстрацию:

Data Format Columnusing with
(X,Y) data X Y 1:2 lines, points, steps,
linespoints, boxes, etc.
Y has an error of dY X Y dY 1:2:3 yerrorbars
X has an error of dX X Y dX 1:2:3 xerrorbars
Y has an error of dY, and
X has an error of dX
X Y dX dY 1:2:3:4 xyerrorbars
Y has a range of [Y1,Y2] X Y Y1 Y2 1:2:3:4 yerrorbars
X has a range of [X1,X2] X Y X1 X2 1:2:3:4 xerrorbars
Y has a range of [Y1,Y2], and
X has a range of [X1,X2]
X Y X1 X2 Y1 Y2 1:2:3:4:5:6 xyerrorbars


Для иллюстрации разберу два рабочих примера с построением графиков с погрешностями и аппроксимацией данных.


Пример 1. Построить график с погрешностями по обеим осям в gnuplot

Итак, есть экспериментальные данные в виде таблицы с разделителями - пробелами:

16 18 0.72 10 whiteLEDS 1 10
12 30 0.61 12 greenUltraBrightLEDS 1 10
8 200 0.45 20 HGlamp 1 15
6 1600 0.35 35 AlGaAsLser 1 50
4 17000 0.28 68 NdYAG-laser 1 900
4 25000 0.27 70 HeNeLaser 1 1100

Нужно построить зависимость первой колонки от второй, при этом погрешности по оси X составляют 7% от данных, а по оси Y указаны в колонке 7. Вот такой при этом получается код для gnuplot:

#! /usr/bin/gnuplot -persist
set terminal postscript 'NimbusSanL-Regu' eps enhanced
set output "./plot/PSFoutofLambdaDeltaLambdavsfromNumberOfElementsPSF.ps"
set encoding koi8r
set xlabel "Light's monochromaticity, {/Symbol l}/{/Symbol D}{/Symbol l}" font "NimbusSanL-Regu,18"
set nokey
set bmargin 4
set ylabel "Number of resolvable points of the PSF's kinoform" font "NimbusSanL-Regu,18"
set logscale x
set grid
set xrange [1:100000]
set mxtics 10
set style line 1 lt 1 pt 7 ps 0.5
plot "./PSFoutofLambdaDeltaLambda.txt" using 2:((300/$1)**2):7:(((300/$1)**2)*0.07) with xyerrorbars linestyle 1, "./PSFoutofLambdaDeltaLambda.txt" using 2:((300/$1)**2) smooth bezier with lines


Результат строительства графика:
Что в этом коде (и графике) есть примечательного, заставившего меня таки покопаться в мануале?

Ну например то, что при строительстве данных с погрешностями вам не удастся использовать линии: опция with linespoints не пройдёт и gnuplot будет выдавать ошибки. И это правильно: экспериментальные данные соединять непрерывной линией - моветон. Так что используем только linestyle 1 который определён так: set style line 1 lt 1 pt 7 ps 0.5 Это значит: тип линии 1, стиль точек 7, размер точки на графике 0.5. Крайние точки я просто соединил кривой Безье, о чём честно написал в коде графика: smooth bezier with lines

Ну и наконец нужно было построить квадратичную зависимость по оси Y, что реализовано так: ((300/$1)**2) то есть число 300 делится для каждой точки на значение в первой колонке, результат возводится в квадрат.



Пример 2. Построить график с погрешностями и аппроксимацией в gnuplot
Задачка посложнее: здесь требовалось экспериментальные точки аппроксимировать прямой линией и погрешностями. Из части данных нужно вычесть постоянную составляющую, так что работы для gnuplot хватает. Итак, сеанс чёрной магии с полным её разоблачением:

#! /usr/bin/gnuplot -persist
set terminal postscript 'NimbusSanL-Regu' eps enhanced solid
set yrange [0.1:10000]
set logscale x
set logscale y
set mxtics 10
set mytics 10
set grid xtics ytics mxtics mytics
set format y "10^{%L}"
set format x "10^{%L}"
set mxtics 10
set output "./plots/1RAWMEANtoSaturateLineApproxcomparingLogscale.ps"
set encoding koi8r
set xlabel "Exposure value, rel. units" font "NimbusSanL-Regu,18"
set ylabel "Signal mean value, DN" font "NimbusSanL-Regu,18"
set key bottom right
set bmargin 4
set style line 1 lt 2 pt 7 ps 1
f(x) = (a*x)+b
fit f(x) "./RAWMEANmeasurementresult" using 4:($3-255.22579) every ::4::35 via a,b
plot "./RAWMEANmeasurementresult" using 4:($3-255.22579):7 title "Digital values of photosensor signal" with yerrorbars linestyle 1, f(x) title "linear fitting function" with line


Сейчас маэстро Воланд скромный автор сих строк разоблачит этот опыт. Первое, что надо разоблачить - аппроксимацию прямой. Здесь сначала задаётся функция f(x) = (a*x)+b которая далее подгоняется под данные using 4:($3-255.22579) из которых вычитается постоянная величина (эксперимент такой был). Далее при подгонке я потребовал от gnuplot
использовать только точки с 4 по 35-ю every ::4::35 и, наконец, подогнать коэффициенты a и b под данные via a,b.

Здесь я отмечу то, что сам часто забываю: директиву every можно использовать не только при подгонке, но и для других графиков. Для этого полезно иметь перед глазами таблицу, которую изваял автор not so Frequently Asked Questions:

every I:J:K:L:M:N
I Line increment
J Data block increment
K The first line
L The first data block
M The last line
N The last data block
every 2 plot every 2 line
every ::3 plot from the 3-rd lines
every ::3::5 plot from the 3-rd to 5-th lines
every ::0::0 plot the first line only
every 2::::6 plot the 1,3,5,7-th lines
every :2 plot every 2 data block
every :::5::8 plot from 5-th to 8-th data blocks

Теперь осталось построить два графика на одном:
plot "./RAWMEANmeasurementresult" using 4:($3-255.22579):7 title "Digital values of photosensor signal" with yerrorbars linestyle 1, f(x) title "linear fitting function" with line

То есть строим зависимость колонки 3 от 4 и используем колонку 7 как источник погрешности. При этом накладываем аппроксимационную линию с помощью директивы f(x) title "linear fitting function" with line

Собственно, вот итог моих фокусов:

Красиво и вполне себе презентабельно, хоть в Nature отправляй.
Читать далее

Создание графиков в gnuplot метки, оси и подписи



10 коммент.
Здесь будет говориться о том, как в gnuplot сделать подписи к осям с греческими буквами, как использовать в легендах надстрочное и подстрочное написание, как ставить стрелки на графиках и прочее.


Как использовать подстрочное / надстрочное написание?
Для этого следует ипользовать расширенный postscript-терминал, указав в скрипте построения графиков:
gnuplot> set terminal postscript enhanced
Надстрочные символы пишутся как X^2, подстрочные Y_3. Если необходимо написать так несколько символов, следует использвать фигурные скобки: Z_{64}. При одновременном надстрочном и подстрочном индексе используйте Z@^2_{64}.

Следующий пример поясняет использование различных вариантов написания, которые могут быть использованы в легенде для функций y=sin**2(x), y=sin**3(x), and y=sqrt(sin(x)).
gnuplot> set terminal postscript eps enhanced
gnuplot> set key spacing 1.3
gnuplot> set xrange [ 0 : pi ]
gnuplot> set yrange [ 0 : 1.5 ]
gnuplot> plot sin(x)**2 ti "sin^2(x)", \
sin(x)**3 ti "sin^3(x)",\
sqrt(sin(x)) ti "sin^{1/2}(x)"




Чтобы надписи не налезали друг на друга в легенде, требуется увеличить межстрочное расстояние. В данном примере оно увеличено на 30% при помощи команды set key spacing 1.3


Как использовать греческие буквы в текстах подписей?
Для этого следует ипользовать расширенный postscript-терминал, указав в скрипте построения графиков:
gnuplot> set terminal postscript enhanced
Греческие символы пишутся в виде {/Symbol a} - это, например, для буквы "альфа". Другие буквы можно найти в таблице:

Буква Символ Буква Символ Буква Символ Буква Символ
A Alpha N Nu a alpha n nu
B Beta O Omicron b beta o omicron
C Chi P Pi c chi p pi
D Delta Q Theta d delta q theta
E Epsilon R Rho e epsilon r rho
F Phi S Sigma f phi s sigma
G Gamma T Tau g gamma t tau
H Eta U Upsilon h eta u upsilon
I iota W Omega i iota w omega
K Kappa X Xi k kappa x xi
L Lambda Y Psi l lambda y psi
M Mu Z Zeta m mu z zeta

Так же можно использовать различные postscript-символы в их восьмеричном коде, например {/243} это символ фунта-стерлинга.
Следующий пример иллюстрирует построение линейной функции y=Alpha x+ Gamma при использовании двух греческих букв.

gnuplot> set terminal postscript eps enhanced
gnuplot> set xrange [ 0 : 5 ]
gnuplot> set label "{/Symbol a}=0.5, {/Symbol g}=0.2" at 2,0
gnuplot> plot 0.5*x-0.2 ti "y={/Symbol a}x-{/Symbol g}"






Как использовать в текстах подписей другие символы (проценты, копирайты)?
Выше уже говорилось о том, что можно использовать специальные postscript-символы, и это совсем не трудно. Для этого следует установить пакет gnuplot-doc и после этого обратиться к файлу ps_guide.ps - там перечислены все коды символов PostScript. Чтобы на одной из осей, к примеру, поставить знак процента в подписи, следует использовать команду:

gnuplot> set xlabel "Halftones, {/Symbol \\045} of grey"
То есть в подписи по оси X будет стоять: Halftones, 45% of grey


Как изменить расстояние между осями и подписью к ним?
Интервал можно изменить при помощи команд set {x|y}label
Например, это:

gnuplot> set xlabel "x" 0.0,1.0
смещает ось Х на высоту одной буквы вверх. Если задать положительное смещение по Y, подпись оси X налезает на содержимое графика, как показано на рисунках ниже.



Y offset = 0




Y offset = +5



Y offset = -5

если смещение по Y отрицательное, расстояние между подписью оси X и графиком становится больше.

Gnuplot пытается нарисовать график таким большим, насколько это возможно, так что высота графика становится больше, когда подпись оси Х смещается вверх. И наоборот, график становится меньше, когда подпись к оси Х смещается вниз.

Читать далее

Построение графиков в gnuplot: двухмерные графики



9 коммент.
Построение графиков в gnuplot достаточно просто и очень эффективно, особенно когда их нужно строить много. Ниже на примерах будет показано, как строить двухмерные графики.

Как построить несколько функций на одном графике?
Есть два варианта: использовать функцию multiplot или внешними редакторами шаманить с EPS-файлами. Ниже будет описан первый вариант как более простой.

При построении нескольких графиков нужно включить режим multi-plot, после чего будет возможно размещать несколько функций или графиков данных в одном окне. Например, построим три функции: y=x, y=x*x и y=x*x*x. Что для этого дополнительно нужно задать в интерактивном режиме:

gnuplot> set multiplot
multiplot> plot x
multiplot> plot x*x
multiplot> plot x*x*x
multiplot> set nomultiplot
Вот что при этом может произойти:



Такое случается потому, что гнуплот определяет границы для каждого графика автоматически, что может привести к нежелательному результату. Следует задавать границы принудительно:
gnuplot> set xrange [-10:10]
gnuplot> set yrange [-10:10]





Как построить график внутри графика?
Рассмотрим это на рабочем примере. Есть файл с данными, точек много, и интерес представляет участок на кривой. Данных много, и естественно это скормить перловому скрипту, который нашинкует графики с подстановкой имён. Вот код графика:
#! /usr/bin/gnuplot -persist
set terminal postscript eps enhanced color solid
set output "~/matlab/programs/kmvdecoder/plots/2conventionalRAWMAXtoSaturatecomparing.ps"
set encoding koi8r
set xlabel "Exposure time, sec." font "Helvetica,18"
set xrange [1:60]
set key top right
set ylabel "Pixels maximum value" font "Helvetica,18"
Это не должно вызывать вопросов - подобное разбиралось тут. Дальше:
set multiplot
set origin 0.0,0.0
set size 1.0,1.0
Устанавливаем стиль линий, которыми будем строить графики
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 "~/matlab/programs/kmvdecoder/plots/RAWMAXmeasurementresult"
using
3 notitle with linespoints linestyle 2,
"~/matlab/programs/kmvdecoder/plots/RAWMAXmeasurementresult" using 3 n
Пути и имена файлов, естественно, нужно поменять, так как я даю всё на примере собственных файлов. Напоминаю, что для ленивых людей, помимо гнуплота, есть ещё и Perl, скрипты которого резво подставят всё нужное в имя файла: и вы поймёте, и цикл перебора организовать проще. Основной график построен - загружаем его в программу просмотра PostScript-файлов и смотрим, где значения, которые нужно строить внутри маленького графика.
set origin 0.55,0.1
set size 0.4,0.4
Первый параметр задаёт положение левой верхней границы маленького графика в относительных единицах длины. Второй - размер графика. Так как подписи к осям на вложенном графике будут только мешать - отключаем их:
set noxlabel 
set noylabel
С видом графика определились, теперь определяемся с осями:
set xrange [ 30 : 38]
set yrange [ 3300 : 3800 ]
Всё, теперь осталось приказать гнуплоту перестроить график (чтобы появился вложенный):
replot
set nomultiplot
Готово - качественный график быстро и легко построен. Вот как он выглядит:



Как построить простую гистограмму?
Если вы создаёте графики в формате PostScript, самый простой способ заключается в том, чтобы нарисовать это при помощи with impluses с очень тонкими линиями. Например, так:
gnuplot> set term postscript eps enhanced color
gnuplot> set style line 1 lt 1 lw 50
gnuplot> plot "test.dat" using 1:2 with imp ls 1
Вот что при этом получится:


Так же можно заполнять столбики гистограмм цветом или вариантами текстурной заливки при помощи команд
with boxes fs [pattern | solid] номерстилязаливки. Так же можно задавать независимо стиль при помощи команды set style fill.

В случае с with boxes fs pattern, параметр pattern используется для определения заполняющей текстуры. Параметр solid определяет плотность заполнения столбца гистограммы, значени от 0 до 1.

Вот пример гистрограммы, построенной с различной заливкой:
gnuplot> plot "test.dat" usi 1:2:(3) w boxes fs pattern 1,\
gnuplot> "test.dat" usi ($1+5):2:(3) w boxes fs solid 0.7






Как на одном графике построить данные в логарифмическом и обычном масштабе?
Например, есть такой график:


По оси Х в диапазоне [0:30], но вблизи нуля по оси Х данные очень важны и нужно показать их детально. Можно сделать два разных графика, но можно провернуть тоже и на одном.
Сначала построим график до единицы в логарифмическом масштабе:
gnuplot> set log xy
gnuplot> set xrange [ 0.001 : 1 ]
gnuplot> set yrange [ 0.1 : 5000 ]
gnuplot> set xlabel "Energy [eV]"
Для данных в диапазоне [1:30] используем линейные оси, и поместим второй график за первым, используя возможности multiplot. Таким образом, логарифмическая часть графика будет слева, а линейная - справа. Каждый подграфик займёт половину размера картинки. Вот как это выглядит в коде:
gnuplot> set multiplot
multiplot> set size 0.5,1
multiplot> set origin 0.0,0.0
multiplot> set lmargin 10
multiplot> set rmargin 0
multiplot> plot "calc.dat" u 1:2 w l
multiplot> set origin 0.5,0.0
multiplot> set format y ""
multiplot> set lmargin 0
multiplot> set rmargin 2
multiplot> set nolog x
multiplot> set xrange [1:30]
multiplot> set xtic 0,10
multiplot> set mxtic 5
multiplot> plot "calc.dat" u 1:2 w l
multiplot> set nomultiplot
gnuplot>
Результат смотрится очень эффектно:





Как сравнить похожие данные на одном графике?
Если нужно сравнить два набора сходных данных на одном и том же графике, полезно построить график в масштабе относительно другого набора данных. Абсолютная величина значений сравнивается на логарифмическом графике в верхней части, а сотношение показывается в нижней части графика в линейных осях.

Для того, чтобы вычислить соотношение данных одного ряда по отношению к другому, значения по оси Х должны быть одинаковы для обоих рядов. В примере ниже, первая колонка содержит значения Х, вторая колонка содержит значения по оси Y набора данных А, третья колонка содержит значения Y набора данных Б.

Сначала устанавливаем параметры оси Х, одинаковые для обоих наборов данных:
gnuplot> set xrange [ 0.01 : 30 ]
gnuplot> set nokey
gnuplot> set log x
gnuplot> set xtics 10
gnuplot> set mxtics 10
gnuplot> set lmargin 10
gnuplot> set rmargin 2
Теперь создаём нижнюю часть графика, которая показывает соотношение данных. Так как данные по оси Y находятся во втором и третьем столбце файла с данными, можно построить их соотношение так plot 1:($2/$3). Таким образом, вторая часть выглядит так:

gnuplot> set multiplot
multiplot> set yrange [ 0.5 : 1.5 ]
multiplot> set ytic 0.6,0.2,1.4
multiplot> set ylabel "Ratio"
multiplot> set size 1,0.4
multiplot> set xlabel "Energy [eV]"
multiplot> set origin 0.0,0.0
multiplot> set bmargin 3
multiplot> set tmargin 0
multiplot> plot 1 w l 0,"cross.dat" u 1:($2/$3) w l 1
Осталось доделать верхнюю часть, чем сейчас и займёмся. Сделаем размер графика поменьше и отобразим в логарифмических осях. Наименования по оси Х стираем, и вот что получилось:
multiplot> set log xy
multiplot> set yrange [ 0.1 : 5000 ]
multiplot> set ytic 0.1,10
multiplot> set ylabel "Cross Section [b]"
multiplot> set size 1,0.6
multiplot> set origin 0.0,0.4
multiplot> set bmargin 0
multiplot> set tmargin 1
multiplot> set format x ""
multiplot> set xlabel ""
multiplot> plot "cross.dat" u 1:2 w l,"" u 1:3 w l
multiplot> set nomultiplot
gnuplot>
Результат:

Читать далее

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



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

Создание графиков в gnuplot: деления на осях



13 коммент.
Gnuplot автоматически подгоняет деления на осях под данные, однако в сложных графиках их нужно переопределить - о чём говорится ниже.


Как изменить деления для каждой из осей?
Есть два вида делений на осях: основные и дополнительные. Обычно на осях отрисовываются только основные деления, и по умолчанию дополнительные отбражаются только при логарифмическом масштабе. Для переопределения делений на осях используется команда set {x|y}tics например, так:
gnuplot> set xtics 2
gnuplot> set ytics 0,200
gnuplot> plot x**3




Это приведёт к тому, что приращение по оси Х будет равняться 2, так что деления становятся вида -10, -8, ... +10. Для оси Y задано начальное значение (0) и приращение (200), так что GNUplot создаёт деления в точках 0, 200, 400...

Так же можно указать конечное значение, например так:
gnuplot> set ytics 0,200,600.
Дополнительные деления задаются параметром set m{x|y}tics. Интервалы между основными засечками делений делятся на это значение:
gnuplot> set mxtics 2
gnuplot> set mytics 2




Так же возможно поместить собственный текст в деления осей вместо чисел. Например, написать "April", "May", "June", и "July" в позициях X=1,2,3 и 4, что возможно осуществить следующей командой:
gnuplot> set xtics ("April" 1, "May" 2, "June" 3, "July" 4)
gnuplot> plot "test.dat" using 1:2:3 notitle with boxes,\
"test.dat" using 1:2 notitle with lines




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

Команда set ticscale n m изменяет масштаб чисел в деления. Главные деления умножаются на величину n, тогда как дополнительные умножаются на величину m. Если m опущено, дополнительные деления принимают значение половины от величины главной деления.

деления отрисовываются внутрь, а чтобы они отрисовывались наружу, следует указать:
gnuplot> set tics out


Как использовать степенные деления?
Для этого следует переопределить формат следующим образом::
gnuplot> set format x "10^{%g}"
Теперь по оси Х деления станут вида 10^0, 10^1... и так далее.




Как использовать экспоненциальные деления вместо десятичных в логарифмических осях?
Формат по умолчанию "%g", а в логарифмических осях метки записываются в формате "F", например 0.01, 1000, и так далее, если данные в пределах от 0.0001 до 100000. Числа, выходящие за этот диапазон, записываются в формате "E" и записываются как 1e-05, 1e+06, и т.д.

Чтобы сделать деления к осям в виде степени 10, измените формат на "10^{%L}":
gnuplot> set format y "10^{%L}"
Для корректного отображения надстрочных и подстрочных индексов следует использовать расширенный postscript-терминал, добавив в скрипт построения графиков:
gnuplot> set terminal postscript eps enhanced
Вот что получится:



Как убрать отображение чисел из деления?
Просто добавьте параметр:
gnuplot> set format x ""
деления по оси Х отображаться не будут.


Как отобразить промежуточные значения в логарифмическом масштабе?
Обычно логарифмические деления к осям отображаются степенями 10 (1,10,100...). Иногда для лучшего понимания данных, изображённых на графике, требуется поместить засечки на осях между главными подписями, особенно когда диапазон значений невелик. Вот как это можно сделать:
gnuplot> set logscale y
gnuplot> set yrange [1:50]
gnuplot> set ytics (1,2,5,10,20,50)
gnuplot> set format y "%2.0t{/Symbol \327}10^{%L}"
gnuplot> set lmargin 8
gnuplot> set terminal postscript eps enhanced
gnuplot> plot exp(x)/x
Тёмно-красным выделен небольшой хак, который позволяет выводить деления как "число умноженное на 10^n".

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


Этот Postscript-символ отображает умножение точкой. Чтобы изменить его на "крестик", используйте {/Symbol \264}. Описанный здесь хак работает не всегда и не на всех системах.


Как изменить формат чисел в деления осей (общий вопрос)?
Это более общее описание форматов деления к осям: за это отвечает команда set format. Синтаксис команды такой:
set format имяоси{x|y|z|xy|x2|y2} "формат строки"
Например, чтобы гнуплот показывал деления в как десять цифр и три после запятой, нужно дать команду:
gnuplot> set format x "%10.3f"
Синтаксис для цифро такой: "%" + (полная длина).(точность).

Формат отображения выражается одной буквой -- 'f', 'e', 'E', 'g', 'x', 'X', 'o', 't', 'l', 's', 'T', 'L', 'S', 'c' и 'P'. По умолчанию используется "%g". Следующая таблица показывает разницу между форматами 'f', 'e', 'x' и 'o'. Форматы 'e' и 'E' одинаковы всегда, кроме случая, когда текст написан в формате 'e' or 'E'. Формат "%O" присутствует в мануале к гнуплоту, но не работает (скорее всего, ошибка в программе)


Пример (подчёркивание означает пробел)
f десятичны %6.3f __6.00
e,E экспоненциальный %11.4e _5.0000e+01
x,X шестнадцатеричный %x fffffffb
o,O восьмеричный %o 37777766

Форматы 't', 'l', 'T' и 'L' относятся к логарифмическим графикам. Для примера построим график функции y=exp(-x)+exp(x) в диапазоне X значений [-10:10]. Во-первых, эта функция отображается в нелогарифмическом масштабе, так что отобразим данные сразу в трёх форматах:

gnuplot> set format y "%T %t %g"
gnuplot> plot exp(-x)+exp(x)



Можно задать другие форматы при одновременном отображении, как и в этом случае. В данном примере, "%t" отвечает за мантиссу по основанию 10 и "%T" отвечает за степень по основанию 10. Таким образом, число, выраженное в формате "%g", отображается как A x 10^B, где A задано в формате "%t" и B в формате "%T".

Теперь перестроим график:
gnuplot> set logscale y
gnuplot> replot



Читать далее

Создание графиков в gnuplot: пример построения графика



23 коммент.
Согласно официальной документации, gnuplot имеет интерактивный и поточный режим. В интерактивном режиме вы вводите команду за командой, задавая параметры строительства графика. Для изучения возможностей или чтобы построить единственный график это, наверное, нужно, но обычно проще написать скрипт и скармливать его гнуплоту. Об этом далее.

Как в gnuplot построить график
Gnuplot использует скриптовой язык, который описывает строительство графика функции или рядов данных. В скрипте задаются параметры графика: шрифты осей, пределы по осям, расположение легенды. После этого скрипт передаётся по конвейеру гнуплоту, и он выдаст файл PostScript, который и содержит график.

Чтобы быстро посмотреть и, при необходимости, перестроить график, нужно открыть его программой просмотра PS-файлов. Например, kghostview. Её вообще хорошо держать открытой на другом виртуальном рабочем столе, а скрипт построения графика изменять - и при перестраивании график в kghostview автоматически обновится.

Небольшой пример. Имеются ряды данных в обычном текстовом файле, нужно построить график. Вот исходные данные, файл RAWSTDmeasurementresult
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 "~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult" 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,"~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult" using 3 title "RAW data, Blue channel" with linespoints linestyle 2


Ничего сложного в этом нет, сейчас я эти иероглифы прокомментирую.

Даже беглый взгляд на текст при некотором знании английского позволяет догадаться, какие строчки что примерно делают. Понятно, что команда set что-то устанавливает - а устанавливает она параметры построения графика. А команда plot как нетрудно догадаться, что-то строит. Так что всего-то навсего две команды и немного параметров к ним. Не так страшно, как выясняется - для настоящего джигитапользователя никс-систем это не должно быть проблемой.


Пример скрипта построения графика на gnuplot с пояснениями
Итак, разбираем скрипт.

#! /usr/bin/gnuplot -persist
Это обычный заголовок скриптов, только указывает он на gnuplot а не на, скажем, perl или bash. Если вы когда-нибудь видели скрипты, то сразу почувствуете себя как дома.


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 "~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult" 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,
"~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult" using 3
title "RAW data, Blue channel" with linespoints linestyle 2
Вся эта конструкция предписывает строить график, который будет состоять из трёх линий (типа 1, 2 и 3). График строится по данным, которые лежат в одном текстовом файле тут: ~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult

Заголовок у каждой ветви графика разный, он задаётся после
title, а слово using означает, что в файле несколько рядов данных: для первой ветви - первый столбик, для второй ветви - второй столбик и так далее.

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

Следует отметить, что, вопреки распространённому заблуждению, gnuplot выдаёт графики с publication-ready качеством, которые без вопросов принимаются в любом зарубежном (и уж тем более местном) научном журнале. Например, NASA с помощью gnuplot создаёт карты погоды, а некоторые математические системы (типа MATLAB) просто используют куски кода gnuplot чтобы отрисовывать графики. Так что график, который выдаст гнуплот, в любом случае на порядок краше того, на что способен ексель или Openoffice.org Calc.

Для тренировки можно немного поиграть с параметрами и посмотреть, к чему это приводит. Смотреть удобнее всего в kghostview или любой другой программе, способной открыть PostScript-файлы.
Читать далее

Построение графиков в gnuplot: о легендах



7 коммент.
Легенда - это подпись к рядам данных на графике, которая позволяет понять, к каким данным относится одна зависимость, а к каким - другая. Gnuplot называет легенды словом key, а не legend, и это нужно учитывать.

Как убрать легенду с графика?
Есть два способа. Первый: задать значение
gnuplot> set nokey
или можно указать параметр notitle при построении графика, например так:
gnuplot> plot f(x) notitle, "file.dat" title "data"
После этого в графике легенда отображаться не будет.


Как изменить положение легенды на графике?
Обычно легенда отрисовывается в правом верхнем углу графика. Изменить это можно при помощи команд:
gnuplot> set key bottom left
gnuplot> set key bottom right
gnuplot> set key top left
gnuplot> set key top right

Здесь перечислены варианты, позволяющие отрисовывать легенду в левом нижнем, правом нижнем, левом верхнем и правом верхнем углу графика соответственно. Так же можно попросить gnuplot рисовать легенду за пределами графика - для этого следует добавить параметр outside, или под графиком - для этого есть параметр bottom. Например:

gnuplot> set key outside bottom

Так же можно задать положение легенды с помощью координат, хотя это менее гибкий способ. Если хотите сдвинуть легенду в положение (X,Y)=(100,100), даём команду:

gnuplot> set key 100,100

Координата (100,100) это позиция точки между текстом и линией/символом первой линии легенды. Координаты задаются по осям X и Y.


Как избавиться от отображения погрешностей в легенде?
Когда один из рядов данных имеет погрешности, они тоже отображаются в легенде (например, на рисунке ниже). Даже тогда, когда погрешности по оси Y, они отображаются в легенде горизонтально, и это не нужно.

Например, есть ряды данных:
#  X     Y     Y-погрешность
1.0 1.2 0.2
2.0 1.8 0.3
3.0 1.6 0.2

Строим график:

gnuplot> set xrange [0:4]
gnuplot> set yrange [0:3]
gnuplot> plot "test.dat" usi 1:2:3 title "data" w yerrorbars



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

gnuplot> set xrange [0:4]
gnuplot> set yrange [0:3]
gnuplot> plot "test.dat" usi 1:2:3 notitle w yerrorbars 1,\
"test.dat" usi 1:2 title "data" w points 1
Но работает хорошо.



Как изменить межстрочный интервал в легенде?

Это можно сделать при помощи команды set key spacing.
Например, чтобы сделать полуторный межстрочный интервал в легенде, нужно:
gnuplot> set key spacing 1.5
Это увеличит расстояние между строками в легенде.


Как сделать рамку вокруг легенды?
Чтобы вокруг легенды появилась рамка, следует использовать set key box.
Тип линии рамки будет тот же, что вокруг самого графика. Изменить это можно так:
gnuplot> set style line 1 lt 2 lw 3
gnuplot> set key box linestyle 1
Таким образом, вокруг легенды появится рамка.
Читать далее

Создание графиков в gnuplot: предисловие



6 коммент.
Всё началось с того, что мне нужно было построить "график внутри графика". Немного поэкспериментировав, я справился с задачей, но обнаружил, что в различных источниках умалчиваются разные тонкие моменты. Так я начал записывать их, и постепенно пришёл к выводу о том, что хорошо бы иметь подробную документацию по графикам в гнуплоте на русском. Естестенно, что бы не забыть потом, как я лихо строил графики и в какой бубен бил, я выложу сюда.


Что есть gnuplot

Это профессиональная система построения графиков, своеобразный скриптовой язык, "программы" на котором транслируются в графики. Как и любая профессиональная вещь, гнуплот требует освоения -  потребуется определённое время и усилия, чтобы заставить его работать.

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

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


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

Gnuplot не стоит использовать, если нужно построить только один график и тут же о нём забыть. Вообще, если вам нужно построить меньше 3-4 графиков, не стоит выкатывать этот авианосец, чтобы просто немного порыбачить :-)

Вот где gnuplot незаменим, так это при масштабном анализе и обработке данных. Например, снято много экспериментальных данных и их нужно проанализировать и построить десятки графиков. Потом, быть может, их ещё придётся перестраивать, немного изменив оси или пределы по осям. Однажды написанные скрипты могут применяться снова и снова для построения графиков, если эксперимент проводится неоднократно.


Планируемые посты
В общих чертах дело обстоит так. Есть замечательный ресурс, который называется gnuplot tips (not so Frequently Asked Questions). Там собрана куча примеров по использованию gnuplot, что до некоторой степени заменяет чтение длиииииииииииинного и скучнейшего мануала по gnuplot (который к тому же весьма кучеряво организован). И потом, на примерах учиться намного проще, поэтому сей ресурс пользуется заслуженной славой и популярностью.

Поэтому я решил пересказывать оттуда примеры, делая вольный перевод - не дословный, а часто с пояснениями и комментариями.

Вместо интерактивного стиля я предпочитаю поточный - то есть создаём скрипт для гнуплота и потом этот скрипт скармливаем программе. В ответ получаем график, если, конечно, нигде не ошиблись. Это позволяет очень быстро создавать графики скриптами. Но в текстах постов будут приводиться команды из расчёта "пошагового" выполнения - для переделки их в поточный нужно просто убрать "gnuplot>".

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


Ссылки
Часть текста навеяна замечательной статьёй Евгения Балдина Gnuplot. Графики заказывали? 
Сравнение различных программ построения графиков можно найти здесь.
Читать далее

Строим научные графики с помощью GNUplot



29 коммент.
Задача: требуется строить научные графики, двухмерные и трёхмерные, с подписями на осях с греческими буквами - много и часто.
Решение: для этих целей давно и успешно применяется программа gnuplot, которую мы быстро поставим и освоим в Linux.


Введение
Стереотипы, вредные привычки и топорные, неэффективные решения чрезвычайно живучи. Одним из таких топорных решений является применение офисных средств при работе с научными документами. То, что это легко осваивается, вовсе не значит, что это будет удобно и просто. Сколько времени и сил у научных сотрудников уходит в песок - совершенно напрасно и бесцельно. Для того, чтобы эффективно работать в научной среде, необходимо дать себе за труд освоить соответствующие инструменты. Одним из них является LaTeX, другим -
gnuplot. О нём и пойдёт речь дальше.


Немного о gnuplot
Сначала его поставим - как всегда:
#apt-get install gnuplot
Если его теперь запустить, вызвав в консольке
$gnuplot
то он нас поприветствует примерно таким образом:

G N U P L O T
Version 4.0 patchlevel 0
last modified Thu Apr 15 14:44:22 CEST 2004
System: Linux 2.6.15.7

Copyright (C) 1986 - 1993, 1998, 2004
Thomas Williams, Colin Kelley and many others

This is gnuplot version 4.0. Please refer to the documentation
for command syntax changes. The old syntax will be accepted
throughout the 4.0 series, but all save files use the new syntax.

Type `help` to access the on-line reference manual.
The gnuplot FAQ is available from
http://www.gnuplot.info/faq/

Send comments and requests for help to

Send bugs, suggestions and mods to


Terminal type set to 'x11'
gnuplot>

То есть запустилась интерактивная часть программы. Здесь нам предлагают набирать команды и сразу видеть их результат - что не очень удобно, особенно если вы в первый раз работаете с
gnuplot.

Но у
gnuplot есть и другой режим работы - потоковый. На мой взгляд, для освоения и работы он более эффективен. Для того, чтобы быстро начать с ним работу и сразу посмотреть, на что он способен, мы построим небольшой, но показательный график. Всё, что нам потребуется - это ваш любимый текстовый редактор с подсветкой синтаксиса и немного терпения.

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

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

Создаём новый файл, называем, например, simple.graph и начинаем в него записывать команды
gnuplot. Признаком того, что файл относится к скрипту 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"
Устанавливаем метки по осям, размер и тип шрифта: теперь по оси Y
set ylabel "Величина СКО, отн.ед" font "Helvetica,18"
Устанавливаем предел значений по оси Y
set yrange [0:1]
Задаём стиль линии (line1): сплошная прямая(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
Всё, должен появиться график RMSresearch.ps, который можно просмотреть любым графическим редактором. Выглядеть он должен примерно так:



Ну вот, мы и построили первый график в
gnuplot. Причём, график довольно навороченный - с греческими буквами в подписи, правильно подписанными осями и прочим. Теперь людей, работающих в UNIX-системах не первый день, должно замкнуть: раз он воспринимает команды потоково - значит, можно gnuplot завернуть в скрипт и заставить штамповать графики массово? Да, естественно! И я даже скоро приведу пример Perlового скрипта, который это делает. Таким образом мной было построено 96 графиков за 3 секунды. Это ещё один пример CLI Magick...

Ссылки:
Конечно, я не смог в одном посте охватить безбрежные возможности gnuplot, да и не ставил себе таких целей. Тем не менее, в блоге есть и другие статьи по gnuplot:

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


Англоязычные ресурсы:

Самым информативным ресурсом по
gnuplot является домашняя страница одного японца, которая называется gnuplot tips (not so Frequently Asked Questions) с английским вариантом. Информации там море, достаточно хорошо структурирована и главное - море примеров. Далее есть Gnuplot FAQ, в котором информация больше идеологического плана. Интересная страница "Visualize your data with gnuplot" на сайте IBM, где приводятся несколько показательных примеров использования gnuplot.

Русские ресурсы:
Кое-что есть и в нашем отечестве. Статья "Примеры построения графиков" подойдёт для начального ознакомления, а статья "GnuPlot нарисует график" подойдёт для более глубокого ознакомления.
Читать далее