Страницы

6 июн. 2013 г.

Гистограммы в гнуплоте

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

Собственно, ничего нового я не изобрел, пример гистограммы есть на оф. сайте гнуплота. Просто сейчас мы разберём как оно работает и как им пользоваться в личных целях.


Простая гистограмма

Данные, по которым будет построена гистограмма, должны располагаться в текстовом файле, по одному числу на строке. Пусть он будет называться distribution.txt, а скрипт, строящий график — histogram.plot.

Вот содержимое скрипта:

#!/usr/bin/gnuplot -persist width=10 bin(x, s) = s*int(x/s) + width/2 set boxwidth width plot 'distribution.txt' u (bin($1,width)):(1.0) s f w boxes fs solid 0.5 title 'гистограмма'

Теперь о том, что каждая строчка означает.

#!/usr/bin/gnuplot -persist — sha-bang, работает только в *nix;
width=10 — в эту переменную записываем ширину столбца гистограммы;
bin(x, s) = s*int(x/s) + width/2 — функция определяет в какой из столбиков попадет число;
set boxwidth width — задаём ширину столбца для рисования, используя переменную width;
plot 'distribution.txt' — тут вроде все понятно;
u (bin($1,width)):(1.0) — по оси X откладываем результат функции bin() от первого столбца в файле, а по Y — просто единичку;
s f — суммировать Y (smooth frequency);
w boxes — рисовать столбики (для эксперимента попробуйте lines, linespoints, points, impulses);
fs solid 0.5 — определяем стиль заливки столбиков (fillstyle) как сплошной (solid) с 50%-ной непрозрачностью;
title 'гистограмма' — подпись в легенде;

Теперь либо запускаем сам скрипт:

chmod +x histogram.plot ./histogram.plot

либо скармливаем его гнуплоту

gnuplot -persist histogram.plot

В любом случае получаем картинку:

Симпатично, но стоит слегка поправить. Делаю width=100 и добавляю ограничение на диапазон иксов set xrange [:6000]. Ещё можно включить сетку: set grid.

Собственно, здесь я ожидал увидеть ассимметричное распределение. Так и получилось.

Внимательные читатели заметили, что диапазон по оси Y сократился. Это происходит потому, что высота столбика показывает количество попаданий в диапазон, определяемый его шириной. Следовательно, чем уже столбик, тем меньше в него попадает.

Добавляем точки

Не знаю, как назвать эту модификацию. Просто покажу исходник и результат.

#!/usr/bin/gnuplot -persist width=100 bin(x, s) = s*int(x/s) + width/2 set xrange [:6000] set boxwidth width set grid plot 'distribution.txt' u (bin($1,width)):(1.0) s f w boxes fs solid 0.5 t 'гистограмма', \ "" u 1:(300*rand(0)-350) lt 1 notitle

Каждая красная точка соответствует одному измерению. С ними хорошо заметны выбросы. Вот только в диапазоне 1000–2000 точек слишком много, от чего они сливаются в сплошную красную массу. Можно конечно растянуть полосу пошире, но мы пойдем другим путем.

#!/usr/bin/gnuplot -persist width=100 bin(x, s) = s*int(x/s) + width/2 set xrange [:6000] set boxwidth width set grid plot 'distribution.txt' u (bin($1,width)):(1.0) s f w boxes fs solid 0.5 title 'гистограмма', \ "" u 1:(300*rand(0)-350):(15) w circles lc rgb "red" fs transparent solid 0.05 noborder notitle

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

Заключение

Графики — это красивые картинки, которые зачастую оказываются информативнее голых чисел. Для того и были придуманы.

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

Ссылки

обновлено 18.07.2014

Комментариев нет:

Отправить комментарий