gnuplot: график данных от месяца назад до настоящего времени - PullRequest
2 голосов
/ 27 февраля 2012

каждый.

У меня есть некоторые данные, которые периодически обновляются. Например:

1330347541 79 100 6 163 38
1330349341 80 103 6 165 38
1330351141 80 104 6 166 40
1330352941 80 104 6 166 40
1330354741 81 104 8 167 41

Я хочу нарисовать эти данные на графике с помощью gnuplot.

Как я могу нарисовать данные за месяц до этого? Какой xrange мне нужно выбрать?

Редактировать : мне нужно что-то вроде "set xrange [сейчас - 2592000, сейчас]"

Ответы [ 2 ]

1 голос
/ 07 мая 2015

У меня была похожая проблема.Хотя вы не показали, как именно вы делали сюжет.Я хотел установить диапазон, используя временные метки, и нашел что-то неожиданное.,,поэтому, несмотря на свою старую, я думаю, что стоит ответить на этот вопрос.

Две полезные вещи:

  1. Вы можете построить график с xrange, установленным на [*. *], а затем «показать xrange».'чтобы узнать, какое внутреннее представление xrange используется вашим gnuplot.

  2. Вы можете использовать () в gnuplot для вставки вычислений и вызовов функций.

Ответ # 1 Вы строите график с использованием временной колонки?До gnuplot 4,7 внутренние времена gnuplot отслеживались относительно 1 января 2000 года, а не эпохи unix 1 января 1970 года.Ответ зависит от того, какую версию gnuplot вы используете?Вы можете использовать () в gnuplot для выполнения функций вызова или выполнения вычислений.Вы можете вызвать дату команды оболочки, чтобы получить метку времени.Так .,,

set xrange [(system("date -d 'now' +%s")-2592000):(system("date -d 'now' +%s"))]
show xrange
    set xdata time
    set xrange [ "1431007547" : "1431008547" ] noreverse nowriteback

До gnuplot 4.7 вы также должны вычесть 946684800 секунд из всех временных отметок.Фактически я обнаружил, что около 1893370441 секунд = ~ 60 лет - это значение, которое я должен вычесть с моей версией gnuplot (4.6).Найдите смещение метки времени, выполнив график с данными метки времени, не устанавливая xrange, а затем выполните 'show xrange' и вычислите смещение.

Поэтому определите используемое смещение и установите xrange следующим образом:

####################################################################
## 1893456000 = 60 years seems to be the offset gnuoplot is using.##
## or is it 1893370441 ? yeah it seems to be a bit short of 60 years.
## I believe 946684800 should be the offset prior to 4.7.         ##
####################################################################
TIMEOFFSET=946684800
TIMEOFFSET=1893370441
set xrange [(system("date -d 'now' +%s")-2592000-TIMEOFFSET):(system("date -d 'now' +%s")-TIMEOFFSET)]

Ответ # 2 Действительно ли ваш xrange находится в строках файла данных?(т.е. не используя timecolumn).В этом случае установите свой xrange в терминах строк данных.Если ваши данные периодические, вы можете рассчитать, сколько строк назад = определенный период времени.

Я использую эту версию gnuplot:

    Version 4.6 patchlevel 1    last modified 2012-09-26 

БОЛЬШЕ деталей и исследования ...

Сделайте базовый график ваших данных:

set xdata time
set timefmt "%s"
set timefmt x "%s"
set format x "%H:%M"
plot "lollo.data" using 1:2, "lollo.data" using 1:3

Хорошо, теперь установите простой xrange от первой до последней отметки времени в данных.

set xrange [1330347541:1330351141]
plot "lollo.data" using 1:2, "lollo.data" using 1:3
                                               ^
     all points y value undefined!

Вау !?В самом деле?Что не так с этим?Давайте сделаем 'show xrange', чтобы увидеть, что gnuplot считает диапазоном.

show xrange
    set xdata time
    set xrange [ "1330347541" : "1330351141" ] noreverse nowriteback

Это выглядит хорошо.Давайте установим xrange на *: * (с чего начинается gnuplot (вы также можете сделать 'set xrange restore' НО, который устанавливает его на [-10: 10] - не то, что нам нужно)), сделайте заговор и ТО покажите xrange.

set xrange [*:*]
plot "lollo.data" using :2, "lollo.data" using :3
show xrange
    set xdata time
    set xrange [ * : * ] noreverse nowriteback  # (currently ["0":"4"] )

Хмммн.0: 4 !!Интересно.Похоже, xrange работает со строками данных не вовремя.Так.Это твоя проблема?Предполагая, что xrange будет работать в метках времени, а не в строках?Зная это, вы сможете установить свой xrange в терминах строк.== Ответ # 2

Сейчас.Давайте построим данные, используя временной столбец.

set xrange [*:*]
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3
show xrange
    set xdata time
    set xrange [ * : * ] noreverse nowriteback  # (currently ["-563022900":"-563014800"] )

Ой!-563022900!?Отрицательная отметка времени.Интересно.Итак, странность / особенность вычисления целой отметки времени в этой версии gnuplot?

Давайте попробуем установить простой xrange от первой до последней отметки времени в данных и графике с использованием timecolumn.

set xrange [1330347541:1330351141]
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3
                                                                           ^
     all points y value undefined!

Это неэто не так.Понятно, если он работает с внутренними отрицательными временными метками.

Давайте установим отрицательный диапазон LESS на один месяц секунд, используя () для вычисления окружения:

set xrange [(-563014800-2592000):-563014800]
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3

Это работает.Для меня.Гнуплот 4.6.Но откуда взялся -563014800 !?

$ date -d @1330347541
Mon 27 Feb 12:59:01 GMT 2012
$ dc -e '1330347541 16o p'
4F4B7E15
### ??? I didn't find any hex relation - looking for evidence of integer calc overflow/sign calc errors

# What offset 
$ dc -e '0 1330347541 - 563022900 - p'
-1893370441
# taking a timestamp from today (7 march 2015) and doing a plot I saw gnuplot used xrange with -462448800 . . . 
$ dc -e '0 1431000097 - 462448800 - p'
-1893448897

Ха!Это примерно то же самое.-1893448897 = ~ -1893370441 Это примерно 60 лет.ТАК.Смещение 60 лет используется.В моей версии gnuplot. ИНТЕРЕСНО. и ДА.Так что мне нужно вычесть около 1893456000 секунд для преобразования во внутреннюю временную метку gnuplot.На самом деле 1893370441 кажется ближе к тому, что нужно.

В другом месте в эпоху интернета говорят, что эпоха gnuplot наступила в 2000 году. Это должно означать, что следует использовать смещение 946684800.Но, похоже, сейчас это не так.

YMMV.Похоже.

Используя это смещение, вы можете установить xrange от месяца назад до настоящего момента так: == Ответ # 1

TIMEOFFSET=1893370441
set xrange [(system("date -d 'now' +%s")-2592000-TIMEOFFSET):(system("date -d 'now' +%s")-TIMEOFFSET)]

И как / почемуэто дело в gnuplot?

От: http://gnuplot.10905.n7.nabble.com/30-year-time-offset-reading-nonuniform-matrix-s-input-td17231.html«Извините, я думаю, что это был, вероятно, я. Я тогда не использовал unix, поэтому 2000 год казался таким же произвольным, как и 1970.

Изначально не предполагалось, что он все равно будет виден пользователю, но этоПозже было обнаружено, что вы можете использовать числа, а не строки в таких вещах, как установка диапазонов для данных времени.

Я думаю, что я также имел в виду, что, поскольку время хранилось как реальное число, носить его было нехорошобольшое смещение, поскольку это ограничивало разрешение, доступное для небольших чисел. Но я думаю, что это, вероятно, не имеет значения на практике.

Дейв D "

1 голос
/ 29 февраля 2012

Решение:

plot \
    "< awk -v date=`date +'%s'` '{ if ($1 > date - 2592000) print $0; }' datafile" using 1:2 …
...