Имам файл с данни с две колони: Xi
и Yi
. Бих искал да начертая Xi
срещу (Yi-1 - Yi)/Yi-1
за i>1
. Възможно ли е да се направи това директно в GNUPlot?
Как да използвам няколко реда от файл с данни в gnuplot?
Отговори (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 се промени, но вероятно не си струва за този хак.
Да направите това директно в 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))
replot
без да нулирате firstval
- person mata; 14.11.2012