Градиентная заливка графика RRDtool

Приветствую Вас:)
В этом материале рассмотрим как нам украсить график(и) полученные в этой статье. В основном мне попадались графики у которых для заливки цвета брались в процентном соотношении от текущей линии графика и раскрашивались, т.е. назначались цвета с шагом к примеру 10%, далее на практике выходит, что 10° или 20° на самом верху будут иметь одинаковый цвет, вот пример (взят из галереи RRDtool, правда измеряется не температура, а давление, но суть не меняет (можно посмотреть онлайн))

img-0На графике видно, что значение  676 раскрашено точно так же как и 684,что на мой взгляд не совсем правильно, хотя сам график очень даже симпатичный:).
Мы пойдем другим путем, приступим.
Немного изменим наш код скрипта для генерации графика

#!/bin/sh
#Экспортируем нашу локаль, у меня KOI-8, свою локаль Вы можете проверить командой "locale"
#без этого на график не получится вывести кириллические символы
export LANG=KOI8-R
export LC_ALL=ru_RU.KOI8-R
#Строим график либо все в одну строку, либо через разделитель " ", комментарии в строке вызовут ошибку
rrdtool graph 
/usr/local/www/temperature/test.png 
--width 400 
--height 250 
--font TITLE:13 
--color BACK#444444 
--color SHADEA#444444 
--color SHADEB#444444 
--color CANVAS#444444 
--color FONT#ff7518 
--slope-mode 
--start -1d 
--end now 
--units-exponent 0 
--vertical-label "Температура, C°" 
--title "Температура за сутки" 
--imgformat PNG 
DEF:temperature=/var/db/rrdtool/temperature.rrd:temperature:AVERAGE 
LINE1:temperature#00ff00:"" 
CDEF:tp_17=temperature,0,GT,temperature,100,GT,34,temperature,IF,0,IF AREA:tp_17#FF0000 
CDEF:tp_16=temperature,0,GT,temperature,32,GT,32,temperature,IF,0,IF AREA:tp_16#FF1100 
CDEF:tp_15=temperature,0,GT,temperature,30,GT,30,temperature,IF,0,IF AREA:tp_15#FF2200 
CDEF:tp_14=temperature,0,GT,temperature,28,GT,28,temperature,IF,0,IF AREA:tp_14#FF3300 
CDEF:tp_13=temperature,0,GT,temperature,26,GT,26,temperature,IF,0,IF AREA:tp_13#FF4400 
CDEF:tp_12=temperature,0,GT,temperature,24,GT,24,temperature,IF,0,IF AREA:tp_12#FF5500 
CDEF:tp_11=temperature,0,GT,temperature,22,GT,22,temperature,IF,0,IF AREA:tp_11#FF6600 
CDEF:tp_10=temperature,0,GT,temperature,20,GT,20,temperature,IF,0,IF AREA:tp_10#FF7700 
CDEF:tp_09=temperature,0,GT,temperature,18,GT,18,temperature,IF,0,IF AREA:tp_09#FF8800 
CDEF:tp_08=temperature,0,GT,temperature,16,GT,16,temperature,IF,0,IF AREA:tp_08#FF9900 
CDEF:tp_07=temperature,0,GT,temperature,14,GT,14,temperature,IF,0,IF AREA:tp_07#FFAA00 
CDEF:tp_06=temperature,0,GT,temperature,12,GT,12,temperature,IF,0,IF AREA:tp_06#FFBB00 
CDEF:tp_05=temperature,0,GT,temperature,10,GT,10,temperature,IF,0,IF AREA:tp_05#FFCC00 
CDEF:tp_04=temperature,0,GT,temperature,8,GT,8,temperature,IF,0,IF  AREA:tp_04#FFDD00 
CDEF:tp_03=temperature,0,GT,temperature,6,GT,6,temperature,IF,0,IF  AREA:tp_03#FFEE00 
CDEF:tp_02=temperature,0,GT,temperature,4,GT,4,temperature,IF,0,IF  AREA:tp_02#FFFF00 
CDEF:tp_01=temperature,0,GT,temperature,2,GT,2,temperature,IF,0,IF  AREA:tp_01#ffff00 
CDEF:tm_17=temperature,0,LT,temperature,-100,LT,-34,temperature,IF,0,IF AREA:tm_17#0000FF 
CDEF:tm_16=temperature,0,LT,temperature,-32,LT,-32,temperature,IF,0,IF AREA:tm_16#0011FF 
CDEF:tm_15=temperature,0,LT,temperature,-30,LT,-30,temperature,IF,0,IF AREA:tm_15#0022FF 
CDEF:tm_14=temperature,0,LT,temperature,-28,LT,-28,temperature,IF,0,IF AREA:tm_14#0033FF 
CDEF:tm_13=temperature,0,LT,temperature,-26,LT,-26,temperature,IF,0,IF AREA:tm_13#0044FF 
CDEF:tm_12=temperature,0,LT,temperature,-24,LT,-24,temperature,IF,0,IF AREA:tm_12#0055FF 
CDEF:tm_11=temperature,0,LT,temperature,-22,LT,-22,temperature,IF,0,IF AREA:tm_11#0066FF 
CDEF:tm_10=temperature,0,LT,temperature,-20,LT,-20,temperature,IF,0,IF AREA:tm_10#0077FF 
CDEF:tm_09=temperature,0,LT,temperature,-18,LT,-18,temperature,IF,0,IF AREA:tm_09#0088FF 
CDEF:tm_08=temperature,0,LT,temperature,-16,LT,-16,temperature,IF,0,IF AREA:tm_08#0099FF 
CDEF:tm_07=temperature,0,LT,temperature,-14,LT,-14,temperature,IF,0,IF AREA:tm_07#00AAFF 
CDEF:tm_06=temperature,0,LT,temperature,-12,LT,-12,temperature,IF,0,IF AREA:tm_06#00BBFF 
CDEF:tm_05=temperature,0,LT,temperature,-10,LT,-10,temperature,IF,0,IF AREA:tm_05#00CCFF 
CDEF:tm_04=temperature,0,LT,temperature,-8,LT,-8,temperature,IF,0,IF AREA:tm_04#00DDFF 
CDEF:tm_03=temperature,0,LT,temperature,-6,LT,-6,temperature,IF,0,IF AREA:tm_03#00EEFF 
CDEF:tm_02=temperature,0,LT,temperature,-4,LT,-4,temperature,IF,0,IF AREA:tm_02#00FFFF 
CDEF:tm_01=temperature,0,LT,temperature,-2,LT,-2,temperature,IF,0,IF AREA:tm_01#CDFFFF 
GPRINT:temperature:LAST:"Текущая:%3.2lfC°" GPRINT:temp_0:AVERAGE:"Средняя:%3.2lfC°" GPRINT:temp_0:MAX:"Максимальная:%3.2lfC°" GPRINT:temp_0:MIN:"Минимальная:%3.2lfC°j" 
HRULE:0#00ffff

Где мы определили несколько CDEF (CDEF:имя-переменной=выражение_в_обратной_польской_записи (виртуальный DS)):

  • tp_01-tp_17 — будет расскрашивать на графике положительную температуру с шагом в 2 градуса от желтого к красному
  • tm_01-tm_17 — раскрашивают график при отрицательных значениях температуры с шагом в 2 градуса от голубого к синему

Вот что у меня получилось на выходе
img-1Построил график за 2 месяца (машинка тестовая, использовалась исключительно для написания статей про Digitemp и RRDtool и проверки правильности скриптов, из-за этого мало значений на графике, т.к. после написания статей термометр был возвращен в серверную:)).
Ну собственно все, спасибо за внимание:)

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Комментарии: 7
  1. img-8
    Rossi25

    А я так понимаю, что под cgi понималось, что график будет рисоваться не регулярно, а только по запросу из браузера, но про это не написано?

    1. img-9
      Vladimir (автор)

      Приветствую! Здесь не про cgi(rrdcgi), описан обычный shell скрипт, который по cron генирит графики.
      Вы хотите через rrdcgi делать графики?
      Написал про CGI

  2. img-10
    ily@

    Чего то не хватает в скрипте, повторил градиентную заливку и когда не было данных (нет питания) значение заливки максимум, а не пустота. Админ открой секрет. И еще поделись скриптом на фазы луны и прочее под графиком.

    1. img-11
      Vladimir (автор)

      Приветствую! Насчет фаз луны и восходов-заходов на днях напишу.
      Со скриптом — я его особо не отлаживал, писал для статьи, проверил на тестовом компе — все работало, но не тестировал при отсутствии данных.

      1. img-12
        ily@

        Вы обещали на днях поделится информацией о фазах луны :)

        1. img-13
          Vladimir (автор)

          Приветствую!
          Что-то дел много:)
          Делал из этого https://github.com/dfeyer/moonphase, если будут вопросы — обращайтесь.

  3. img-14
    ily@

    Если перейти по ссылке Температура (в шапке), выбрать период год то на графике в мае месяце есть пропуск, смотрится куда красивее чем зашкаливание по максимуму :)

Добавить комментарий

:) :D :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.