Совсем недавно появилась у меня задача построить графики на основе показаний с удаленных датчиков. В частности, нужно было обработать данные колебаний температуры воздуха во времени. Выглядело это следующим образом. С удаленного датчика сигнал с информацией поступает на приемное устройство, затем на компьютер и далее пишется в Mysql. И следующим шагом нужна была обработка и генерация графиков для отчетов. Графики строились нескольких типов — суточные, недельные, месячные.
Задача несложная, только нужно было учесть ряд моментов. Так, интервал между «точками» измерений мог меняться. Если в тестовой конфигурации датчик отправлял замеры каждые 2 минуты, то в рабочей конфигурации, замеры делались с интервалом 15 минут. Потом пакеты при передаче из-за радиопомех могли теряться, соответственно в наблюдениях могли быть неравномерные промежутки, поэтому требовалась интерполяция значений.
Весь процесс нужно было автоматизировать, задачи по формированию графиков планировалось запускать по крону на специальном сервере (Ubuntu Server). В качестве инструмента для построения графиков я выбрал gnuplot. Программа очень удобная и главное умеет работать со скриптами, поддерживает такие графические форматы как PNG, EPS, SVG. В общем — то, что надо.
Итак, нужно было начертить 2 оси, по «X» — отложить координаты времени (в часах), по «Y» — координаты значений температуры (от -40 до 40). И затем на этой координатной сетке выставлять точки измерений соединяя их кривой.
В качестве примера для разбора, как работает gnuplot, привожу ниже скрипт построения графика колебаний суточной температуры, т.е. за 24 часа.
Файл с данными — назовем его daily.dat, содержит показания измерений за нужный период времени, т.е. за конкретные сутки. Первый столбец указывает на дату и время замера, а следующий на температуру.
Скрипт с инструкциями gnuplot назовем daily.gnu
Ну и для того чтобы сгенерировать график остается только в терминале запустить gnuplot с этим сценарием.
И в указанном месте "/var/graph/images/daily.png" должен появиться файл.
![](https://habrastorage.org/getpro/geektimes/post_images/e3f/18a/52e/e3f18a52ec93ccaee1a431b815ca3e43.gif)
Если вам нужно сгенерировать векторный файл, например в SVG — для этого нужно изменить всего пару строк:
В рабочем примере файлы со сценарием и с данными формируются скиптом на питоне, формируются и затем запускаются. В самом сценарии (daily.gnu) каждый раз меняется строка с названием графика — «daily_2010.05.12.png», а daily.dat каждый раз обновляется на новые значения.
Собственно и все.
Подробнее по инструкциям gnuplot смотрите на официальном сайте
Там же есть отличная документация PDF, 2Mb
Исходные данные со сценарием можно загрузить отсюда
Спасибо за внимание и удачного вам кодинга!
Задача несложная, только нужно было учесть ряд моментов. Так, интервал между «точками» измерений мог меняться. Если в тестовой конфигурации датчик отправлял замеры каждые 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
- #! /usr/bin/gnuplot -persist
-
- #выставляем режим вывода в файл, формат PNG
- #дефолтный шрифт для надписей couri.ttf, размер 8px,
- #фон графика белый, шрифт черный
- #размер графика 640x480px
- set term png enhanced font "/usr/share/fonts/truetype/msttcorefonts/couri.ttf,8" \
- xffffff x000000 size 640,480
-
- set output "/var/graph/images/daily.png" #указываем путь и имя файла
- set encoding iso_8859_1 #выставляем кодировку
- set tmargin 1 #отступ сверху
- set tics out #выставляем черточки снаружи
- set size 1.0,1.0 #выставляем пропорции графика
- set nokey #не выводим заголовка
- set grid #выводим грид
- set xzeroaxis lt -1 #рисуем нулевую линию
- set yzeroaxis
-
- #параметры по «X»
- set xdata time #выставляем, что данные по «X» это время
- set timefmt "%Y-%m-%d %H:%M:%S" #формат времени
- set xtics 7200 #шаг 2 часа (60*60*2)
- set format x "%H" #на координате отображаем только значение часа (hour)
-
- #параметры по «Y»
- set ytics 5 #шаг 5 градусов
- set yrange [-40:40] #интервал значений от -40 до 40
- set format y "{%g}^o" #на координате отображаем значение и пишем в степени градус
-
- #параметры по «Y2»
- set y2range [-40:40]
- set y2tics 5
- set format y2 "{%g}^o"
-
- #задаем стиль линии 1 (line 1)
- #linetype задает цвет линии (можно использовать дефолтные значения 1,2,3…)
- #или указать свой цвет - rgb "#409ff1"
- #lw – linewidth, pt – pointtype, ps - pointsize
- set style line 1 lt rgb "#409ff1" lw 2 pt 3 ps 0.5
-
- #рисуем график
- #указываем, где брать данные - daily.dat
- #какие колонки смотреть - using 1:3
- #говорим какой метод интерполяции использовать - smooth csplines
- #говорим какой стиль линий использовать - linestyle 1
- 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" должен появиться файл.
![](https://habrastorage.org/getpro/geektimes/post_images/e3f/18a/52e/e3f18a52ec93ccaee1a431b815ca3e43.gif)
Если вам нужно сгенерировать векторный файл, например в 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
Исходные данные со сценарием можно загрузить отсюда
Спасибо за внимание и удачного вам кодинга!