Tuesday 25 December 2007

обработка научных данных в gnuplot

Gnuplot предоставляет широчайшие возможности для обработки и визуализации результатов эксперимента, работа в потоковом режиме позволяет использовать скрипт для создания графиков, что может быть очень удобнопри повторном проведении эксперимета - достаточно просто записать данные в текстовый файл и запустить скрипт.
Пусть мы имеем файл с данными эксперимента, записанными по колонкам:
//file.dat
#x y
0.1 1
0.2 1.4
0.3 1.5
0.4 2.0
0.5 2.5
0.6 2.8
0.7 3.7

скрипт для создания графика будет выглядеть так:
//plot
#!/usr/bin/gnuplot
set term postscript eps enhanced color
f(x) = a*x+b
fit f(x) 'file.dat' using 1:2 via a,b
set output 'graph.ps'
set title 'simple curve'
set xlabel 'x'
set ylabel 'y'
if(b<0) plot 'file.dat' using 1:2 notitle, a*x+b title sprintf("f(x) = %3.4f*x %3.4f",a,b);else
plot 'file.dat' using 1:2 notitle, a*x+b title sprintf("f(x) = %3.4f*x + %3.4f",a,b)

1 строка определяет интерпретатор то есть gnuplot,
2 строка определяет формат выходного файла : postscript расширенный цветной
3 строка определяет функцию которой мы хотим аппроксимировать данные
4 строка делает следующее: аппроксимировать данные из файла 'file.dat' функцией f(x) используя 1 и второй столбцы
по параметрам a и b
5 строка устанавливает выходной файл 'graph.ps'
6 строка устанавливает заголовок листа
7,8 строки устанавливают метки по осям
9,10 строкипроверяют знак b: если b отрицательно, то построить точки данных из файла с использованием 1 и 2 столбцов не используя легенду и построить функцию к которой это приближено используя легенду, формируемую sprintf, если b положительно то делаются то же самое, только в легенде появляется знак "+", дело в том, что
отрицательные числа выводятся со знаком "-" перед ними, а "+" перед положительными числами автоматически не выводится.

sprintf("f(x) = %3.4f*x %3.4f",a,b) подставляет в строку, выделенную кавычками, значения a и b вместо %3.4f, что означат: дробное число, 3 знака до запятой и 4 после, для целых чисел вместо "f" нужно использовать "d".

Также gnuplot позволяет производить простейшие операции с данными, они производятся непосредственно над столбцами, можно применять такие операции как: sqrt(), log(), *.
Для использования этих функций скрипт должен выглядеть следующим образом:


//plot
#!/usr/bin/gnuplot
set term postscript eps enhanced color
f(x) = a*x+b
fit f(x) 'file.dat' using (log($1)):2 via a,b
set output 'graph.ps'
set title 'simple curve'
set xlabel 'x'
set ylabel 'y'
if(b<0) plot 'file.dat' using (log($1)):2 notitle, a*x+b title sprintf("f(x) = %3.4f*x %3.4f",a,b);else
plot 'file.dat' using (log($1)):2 notitle, a*x+b title sprintf("f(x) = %3.4f*x + %3.4f",a,b)

Также можно использовать русские буквы, для этого в начало скрипта нужно вставить set encoding koi8r (utf8 поддерживается с версии 4.3)

Ещё можно получить ошибки для коэффициентов аппроксимации, добавив в скрипт set fit errorvariables, при этом ошибка соответствующая имя_переменной будет доступна в переменной имя_переменной_err .

Полезные материалы по gnuplot
много полезной информации
официальная документация
здесь много примеров(на английском)