Gnuplot: нормализация данных нескольких наборов данных в одном файле - PullRequest
1 голос
/ 05 апреля 2020

Изображение одного файла с 250 наборами данных с различной длиной (2000 + -500) строк и 11 столбцами. Вот полный небольшой пример:

file.sum:

0.00000e+00      9.51287e-09
1.15418e-04      8.51287e-09
4.16445e-04      7.51287e-09
8.53721e-04      6.51287e-09
1.42697e-03      5.51287e-09
1.70302e-03      4.51287e-09
2.27189e-03      3.51287e-09
2.54732e-03      1.51287e-09
3.11304e-03      0.51287e-09


0.00000e+00      13.28378e-09 
1.15418e-04      12.28378e-09 
3.19663e-04      11.28378e-09 
5.78178e-04      10.28378e-09 
8.67479e-04      09.28378e-09 
1.20883e-03      08.28378e-09 
1.58817e-03      07.28378e-09 
1.75840e-03      06.28378e-09 
2.21069e-03      05.28378e-09 

Я хотел отобразить каждые 10 наборов данных и нормализовать его для первого элемента. Первое значение нормализации - 9.51287e-09, а второе - 13.28378e-09. Конечно, с этим массивным набором данных я не могу сделать это вручную или даже разделить файл.

Пока я получил каждый десятый набор данных, но с нормализацией у меня есть проблемы.

#!/usr/bin/gnuplot

reset

set xrange [0:0.1]

plot for [val=1:250:10] 'file.sum' i val u 1:11 w l

Работа этого примера:

plot.gp:

#!/usr/bin/gnuplot

reset

set xrange [0:0.01]

plot for [val=1:2:1] 'file.sum' i val u 1:2 w l

Некоторые подсказки, которые я нашел в:

Я думаю, вы можете написать сценарий awk, чтобы справиться с этим, но может быть более дружественный способ для gnuplot. Любые предложения приветствуются.

1 Ответ

2 голосов
/ 05 апреля 2020

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

В консоли gnuplot проверьте help pseudocolumns. column(-2) сообщает вам, в каком блоке вы находитесь, а column(0) сообщает, в какой строке этого блока вы находитесь (отсчет начинается с 0). Определите функцию Normalized(n), которая выполняет следующее: если вы находитесь в первой строке субблока, поместите значение column(n) в переменную y0. Все значения этого блока теперь будут разделены на y0. Также отметьте help ternary.

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

Код:

### normalize each block by its first value
reset session
set colorsequence classic

$Data <<EOD
0.00000e+00      9.51287e-09
1.15418e-04      8.51287e-09
4.16445e-04      7.51287e-09
8.53721e-04      6.51287e-09
1.42697e-03      5.51287e-09
1.70302e-03      4.51287e-09
2.27189e-03      3.51287e-09
2.54732e-03      1.51287e-09
3.11304e-03      0.51287e-09


0.00000e+00      13.28378e-09 
1.15418e-04      12.28378e-09 
3.19663e-04      11.28378e-09 
5.78178e-04      10.28378e-09 
8.67479e-04      09.28378e-09 
1.20883e-03      08.28378e-09 
1.58817e-03      07.28378e-09 
1.75840e-03      06.28378e-09 
2.21069e-03      05.28378e-09 
EOD

Normalized(n) = column(n)/(column(0)==0 ? y0=column(n) : y0)

plot $Data u 1:(Normalized(2)):(myBlocks=column(-2)+1) w lp pt 7 lc var notitle, \
     for [i=0:myBlocks-1] '' u 1:(NaN) w lp pt 7 lc i+1 ti sprintf("Block %d",i)
### end of code

Результат:

enter image description here

...