Вопрос по bash – Как сделать график в gnuplot с наименьшим значением, автоматически вычтенным из данных y?

4

Я планирую время создания большого пакета файлов в gnuplot, чтобы увидеть, создаются ли они линейно по времени (это не так).

Вот мой код:

#!/bin/bash

stat -c %Y img2/*png > timedata

echo "set terminal postscript enhanced colour
set output 'file_creation_time.eps'
plot 'timedata'" | gnuplot

Проблема, с которой я столкнулся, заключается в том, что данные y - это время создания в секундах с момента запуска unix, поэтому график имеет только 1.333 ... e + 09 на оси y. Я хотел бы, чтобы время создания первого файла было уменьшено до нуля, чтобы относительные времена создания были доступны для чтения.

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

Я знаю, что первый раз будет самым маленьким, так как файлы называются последовательно, поэтому есть ли способ получить доступ к первому элементу в файле, что-то вроде

`plot 'data' using ($1-$1[firstelement])`

?

Это почти тот же вопрос, что у меня был некоторое время назад, поэтому я просто связываю его здесь:Reading dataset value into a gnuplot variable (start of X series)... ура! sdaau

Ваш Ответ

3   ответа
1

так что вы можете сказать что-то вроде

gnuplot> plot "< tail -3 test.dat" using 1:2 with lines

для того, чтобы построить только последние три линии. Вы можете использовать что-то подобное для своих целей. Более того, если вы хотите построить график, скажем, от линии 1000 до 2000

plot "<(sed -n '1000,2000p' filename.txt)" using 1:2 with lines 

Ты можешь проверитьэтот сайт, для большего количества примеров.

@Bernhard Да, когда gnuplot строит что-то, он выполняет сбор некоторой базовой информации - хитрость заключается в том, чтобы построить график на нулевом терминале и затем использовать собранный инфо gnuplot. (см. мой ответ выше).
Вы правы, только я не знаю, как это делается. Можете ли вы перетаскивать файлы в переменные, как вы это делаете при построении?
Это не вполне отвечает на мой вопрос - я хочу вычесть постоянное значение из каждого значения в столбце. Однако я попытаюсь использовать способность gnuplot выполнять команды UNIX. andyras
@ Бернхард: Думаю, вопрос в том, как найти ценность$var (а в gnuplot это простоvar не$var -- Я думаю$var даст вам значение вvar столбец данных ...
@AndyRasmussen Может быть, вы можете хранить самое низкое значение в переменной и использоватьusing ($1-$var)
0

Вот и использовал скрипт awk из одного из ответов:

#!/bin/bash

stat -c %Y img2/*png > timedata

echo "set terminal postscript enhanced colour
set output 'file_creation_time.eps'
unset key
set xlabel 'file number'
set ylabel 'file creation time (after first)'
plot \"<awk '{if(NR==1) {shift = \$1} print (\$1 - shift)}' timedata\"" | gnuplot

Вывод выглядит следующим образом (это не те данные, о которых я говорил в моем вопросе, но похожие): enter image description here

Итак, gnuplot может делать то, что я хочу, но это зависит от среды UNIX ...

Я также попробовал метод Мигилсона:

plot 'timedata'
YMIN=GPVAL_Y_MIN
plot '' u ($1-YMIN)

но gnuplot (моя версия 4.4.2) не нашел правильный минимум. Это было близко; похоже, что он построен таким образом, что минимум диапазона y равен 0: enter image description here

О, вы хотели, чтобы первая точка предоставила смещение. Я вижу сейчас.
Я опубликовал обновленный ответ, который не зависит от совместимости с POSIX, хотя я не проверял его. Мне было бы интересно узнать, работает ли он (хотя он использует функцию, с которой я не проводил много времени в gnuplot 4.4)
4

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

set terminal unknown
plot 'datafile' using 1:2
set terminal post enh eps color
set output 'myfile.eps'
YMIN=GPVAL_Y_MIN
plot '' u 1:($2-YMIN)

Если у вас есть gnuplot 4.6, вы можете сделать то же самое сstats команда. http://www.gnuplot.info/demo/stats.html

EDIT Похоже, вы хотите, чтобы первая точка предоставляла смещение (извините, неправильно прочитал вопрос) ...

Если вы хотите, чтобы первая точка предоставляла смещение, вы можете сделать что-то вроде (опять же, не проверено - требуется gnuplot & gt; = 4.3):

first=0;
offset=0;
func(x)=(offset=(first==0)?x:offset,first=1,x-offset)
plot 'datafile' using (func($1))
Конечно, без проблем. Рад помочь.
Это работает отлично! Красиво, спасибо. andyras

Похожие вопросы