субота, 8 вересня 2007 р.

Використання GNUplot для візуалізації наукових даних

Звички та стереотипи живуть довго. На жаль навіть у нашому науковому середовищі внаслідок глибокої комп'ютерної безграмотності люди з великою впертістю намагаються використовувати офісний софт у тих задачах для яких його не розраховано у той же час повністю ігноруючи програми спеціально призначені для роботи з науковою документацією. Внаслідок цього величезна частина часу який можна було б витратити на щось більш корисне витрачається то на боротьбу зі стрибаючими картинками чи таблицями у Word чи на обробку великих об'ємів даних у Excel. На жаль, більшість людей навіть ніколи не чули про той же LaTeX який міг би зекономити їм багато годин. Аналогічно і з побудовою графіків, у цьому пості я розповім про програму GNUplot спеціально призначену для побудови графіків. Саме у ньому побудовані графіки зображені у багатьох закордонних книгах, швидше за все дехто звертав увагу, що на вигляд вони побудовані явно не в екселі.

Отже, нехай у нас є досить великий об'єм даних. Це можуть бути результати фізичного експерименту або ж якісь інші дані. Для нашого прикладу ми можемо їх згенерувати. Отже, створимо вибірку з розподілу випадкових чисел, що підкоряються нормальному закону (це закон використовується для опису багатьох типів випадкових процесів, наприклад навантаження на конструкцію від постійного навантаження). Для цього напишемо нескладну програму на C.

// Генеруємо набір випадкових чисел з нормальним розподілом
#include
#include
#include

float rnd(void) { // Створюємо функцію генерації випадкових чисел в діапазоні [0;1]
float t;
t=(float)(rand() % 1000000000)/1000000000;
return t;
}

int main(void) {
FILE *file;
int i,n;
float v,s,m,x;
printf("Введіть математичне очікування m="); scanf("%f",&m);
printf("Введіть коефіцієнт варіації V="); scanf("%f",&v);
printf("Введіть об'єм вибірки n="); scanf("%d",&n);

file = fopen("distribution.dat","w");
s=v*m; // Вираховуємо стандарт
for(i=1; i<=n; i=i+1) {
x=sqrt(2*log(1/rnd()))*sin(6.2832*rnd())*s+m; // Формула досить заумна, але працює
fprintf(file,"%d %f\n",i,x);
}
fclose(file);
printf("\nДані записано у файл distribution.dat\n");
return 0;
}


Наберемо цей текст у будь-якому редакторі (наприклад gedit) і збережемо у файл gen.c. Якщо комусь цікаво, яка частина коду програми, що робить той завжди може звернутися до відповідної літератури або до Гугла. Отже, тепер зкомпілюємо нашу програму у виконуваний файл:
cc gen.c -lm

Тепер у цій же папці з'явиться файл a.out, який і є нашою програмою. Використаємо її для генерації розподілу, зробимо вибірку десь так у 100000 значень (як відомо у Excel до версії 2007 та у багатьох інших табличних процесорах є обмеження на 65536 рядків, тобто у даному випадку ми в екселі б фізично цього зробити не могли б) з математичним очікуванням 180 і коефіцієнтом варіації 0.1. Числа взяті зі стелі, лише для демонстрації. Отже, запустимо нашу програму:

bum@impress:~/Temp/gnuplot$ ./a.out
Введіть математичне очікування m=180
Введіть коефіцієнт варіації V=0.1
Введіть об'єм вибірки n=100000

Дані записано у файл distribution.dat


Як і відрапортувала програма у цій же папці з'явився файл distribution.dat, це звичайний текстовий файл у якому розміщено два стовпчики з даними: порядковий номер та вирахуване випадкове число. Значення розділені пробілом.

Ну, тепер коли у нас є дані, займемося їх візуалізацією. GNUplot встановлюється як і все в Ubuntu дуже просто:
CODE]sudo apt-get install gnuplot

GNUplot програма хоч і чисто консольна проте інтерактивна, але ми все ж таки будемо використовувати її у пакетному режимі. Створимо новий файл - distr.graph, з наступним вмістом:

#! /usr/bin/gnuplot -persist
set terminal png size 1600,1200
set output "./distr.png"
set encoding default
set xlabel "Iteration"
set ylabel "Stress in the control point"
set autoscale
set style line 1 lt 1 pt 7
plot "./distribution.dat" using 2 title "Stress" with linespoints linestyle 1


У цьому коді послідовно обирається спосіб виведення результату (у даному випадку формат PNG, 1600x1200 пікселів), встановлюються підписи осей і дозволяється програмі самій вибрати масштаб графіку, далі обирається стиль з товщиною лінії (1 піксель) та діаметром точок (7 пікселів). У останньому рядку вказується, що потрібно взяти дані з файлу distribution.dat, а саме, другий стовпчик, підписати цей ряд даних як Stress і відобразити з показом точок вищевказаним типом лінії. Якщо тепер дати команду
cat distr.graph | gnuplot

то з'явиться файл distr.png у якому буде зображено наступне:

Немає коментарів:

Дописати коментар