Как да използвам няколко реда от файл с данни в gnuplot?

Имам файл с данни с две колони: Xi и Yi. Бих искал да начертая Xi срещу (Yi-1 - Yi)/Yi-1 за i>1. Възможно ли е да се направи това директно в GNUPlot?


person Martin    schedule 13.11.2012    source източник


Отговори (2)


Да, възможно е директно с gnuplot -- просто не е лесно:

firstval = NaN
yi1(yi) = (returnval=firstval, firstval=yi, returnval)
plot "datafile" using 1:((yi1($2)-$2)/returnval)

Трябва да използвате вградени функции. вградените функции са във формата:

funcname(args,...) = (statement1,statement2,...,statementn, return_value)

Тук току-що създадох функция за задържане на последната стойност, която е предадена. За съжаление, това решение става малко по-грозно, тъй като не можах да извикам yi1 два пъти в използващата спецификация (втория път щях да получа грешна върната стойност), така че трябваше да препратя директно към променливата, съдържаща върнатата стойност. Не е красиво, но работи. Вероятно бихте могли да го „подобрите“ малко, като подадете $0 (номера на реда) и актуализирате само когато $0 се промени, но вероятно не си струва за този хак.

person mgilson    schedule 13.11.2012

Да направите това директно в gnuplot е трудно. Проблемът е, че трябва да използвате (i-1)-ия елемент във вашето изчисление, което gnuplot не може да направи автоматично. Може да прави прости изчисления, но само на същия ред, например нещо подобно

plot "datafile" using ($1):(($2-$1)/$2)

би било лесно.

За това, което трябва да направите, бих препоръчал octave или бихте могли да подготвите файла си с данни, използвайки приложение за електронни таблици.

В октава можете да начертаете това така:

d = load("datafile")
plot(d(2:end, 1), d(1:end-1, 2)-d(2:end, 2)./d(1:end-1, 2))
person mata    schedule 13.11.2012
comment
Можете да правите подобни неща, ако искате само с gnuplot (вижте моето решение), но бързо става тромаво, ако искате елемента i-2 или i-3. И елементите i+1 и i+2 не могат да бъдат извлечени (но това не е голям проблем - просто изместете индексирането :). - person mgilson; 14.11.2012
comment
@mgilson - не съм мислил за такова решение :) единственият проблем, който виждам е, че не можете да направите replot без да нулирате firstval - person mata; 14.11.2012
comment
Определено вярно -- въпреки че всъщност не се оказвам много често в тези дни. - person mgilson; 14.11.2012