Pull to refresh

Gnuplot: строим графики по экспериментальным данным

Reading time4 min
Views7.8K
Совсем недавно появилась у меня задача построить графики на основе показаний с удаленных датчиков. В частности, нужно было обработать данные колебаний температуры воздуха во времени. Выглядело это следующим образом. С удаленного датчика сигнал с информацией поступает на приемное устройство, затем на компьютер и далее пишется в Mysql. И следующим шагом нужна была обработка и генерация графиков для отчетов. Графики строились нескольких типов — суточные, недельные, месячные.

Задача несложная, только нужно было учесть ряд моментов. Так, интервал между «точками» измерений мог меняться. Если в тестовой конфигурации датчик отправлял замеры каждые 2 минуты, то в рабочей конфигурации, замеры делались с интервалом 15 минут. Потом пакеты при передаче из-за радиопомех могли теряться, соответственно в наблюдениях могли быть неравномерные промежутки, поэтому требовалась интерполяция значений.

Весь процесс нужно было автоматизировать, задачи по формированию графиков планировалось запускать по крону на специальном сервере (Ubuntu Server). В качестве инструмента для построения графиков я выбрал gnuplot. Программа очень удобная и главное умеет работать со скриптами, поддерживает такие графические форматы как PNG, EPS, SVG. В общем — то, что надо.

Итак, нужно было начертить 2 оси, по «X» — отложить координаты времени (в часах), по «Y» — координаты значений температуры (от -40 до 40). И затем на этой координатной сетке выставлять точки измерений соединяя их кривой.

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

Файл с данными — назовем его daily.dat, содержит показания измерений за нужный период времени, т.е. за конкретные сутки. Первый столбец указывает на дату и время замера, а следующий на температуру.
2010-05-12 00:38:11    13
2010-05-12 00:53:42    13
2010-05-12 01:09:13    13
2010-05-12 01:24:45    13


Скрипт с инструкциями gnuplot назовем daily.gnu
  1. #! /usr/bin/gnuplot -persist
  2.  
  3. #выставляем режим вывода в файл, формат PNG
  4. #дефолтный шрифт для надписей couri.ttf, размер 8px,
  5. #фон графика белый, шрифт черный
  6. #размер графика 640x480px
  7. set term png enhanced font "/usr/share/fonts/truetype/msttcorefonts/couri.ttf,8" \
  8. xffffff x000000 size 640,480
  9.  
  10. set output "/var/graph/images/daily.png" #указываем путь и имя файла
  11. set encoding iso_8859_1    #выставляем кодировку
  12. set tmargin 1        #отступ сверху
  13. set tics out        #выставляем черточки снаружи
  14. set size 1.0,1.0    #выставляем пропорции графика
  15. set nokey        #не выводим заголовка
  16. set grid        #выводим грид
  17. set xzeroaxis lt -1    #рисуем нулевую линию
  18. set yzeroaxis
  19.  
  20. #параметры по «X»
  21. set xdata time        #выставляем, что данные по «X» это время
  22. set timefmt "%Y-%m-%d %H:%M:%S"    #формат времени
  23. set xtics 7200        #шаг 2 часа (60*60*2)
  24. set format x "%H"    #на координате отображаем только значение часа (hour)
  25.  
  26. #параметры по «Y»
  27. set ytics 5        #шаг 5 градусов
  28. set yrange [-40:40]    #интервал значений от -40 до 40
  29. set format y "{%g}^o"    #на координате отображаем значение и пишем в степени градус
  30.  
  31. #параметры по «Y2»
  32. set y2range [-40:40]
  33. set y2tics 5
  34. set format y2 "{%g}^o"
  35.  
  36. #задаем стиль линии 1 (line 1)
  37. #linetype задает цвет линии (можно использовать дефолтные значения 1,2,3…)
  38. #или указать свой цвет - rgb "#409ff1"
  39. #lw – linewidth, pt – pointtype, ps - pointsize
  40. set style line 1 lt rgb "#409ff1" lw 2 pt 3 ps 0.5
  41.  
  42. #рисуем график
  43. #указываем, где брать данные - daily.dat
  44. #какие колонки смотреть - using 1:3
  45. #говорим какой метод интерполяции использовать - smooth csplines
  46. #говорим какой стиль линий использовать - linestyle 1
  47. plot "./daily.dat" using 1:3 smooth csplines linestyle 1
* This source code was highlighted with Source Code Highlighter.

Ну и для того чтобы сгенерировать график остается только в терминале запустить gnuplot с этим сценарием.
# gnuplot ./daily.gnu

И в указанном месте "/var/graph/images/daily.png" должен появиться файл.


Если вам нужно сгенерировать векторный файл, например в SVG — для этого нужно изменить всего пару строк:
set term svg enhanced size 640,480 font "/usr/share/fonts/truetype/msttcorefonts/couri.ttf,8"
set output "var/graph/images/daily.svg"

В рабочем примере файлы со сценарием и с данными формируются скиптом на питоне, формируются и затем запускаются. В самом сценарии (daily.gnu) каждый раз меняется строка с названием графика — «daily_2010.05.12.png», а daily.dat каждый раз обновляется на новые значения.
Собственно и все.

Подробнее по инструкциям gnuplot смотрите на официальном сайте
Там же есть отличная документация PDF, 2Mb

Исходные данные со сценарием можно загрузить отсюда
Спасибо за внимание и удачного вам кодинга!
Tags:
Hubs:
Total votes 9: ↑8 and ↓1+7
Comments10

Articles