Сравнение и построение данных в gnuplot
Данные, которые у меня есть, в этом формате в текстовом файле:
#REY2_0 REY1_0 alpha1 alpha2 omega
100 200 (-0.1,0) (1,0) (0.94379237,-0.052310783)
Список значений довольно длинный. Мне нужно найти значения REY2_0 и REY1_0, для которых значение второй части омеги равно 0 (под секундой я бы подразумевал значение -0.052310783 в приведенном выше случае). Могу ли я использовать gnuplot, чтобы выполнить эту операцию поиска и построить REY2_0 v / s REY1_0? Кроме того, поскольку большинство значений не точно равно нулю, я также хотел бы получить значения REY2_0 и REY1_0, для которых первые три цифры равны нулю (т. Е. Имеют вид 0.000xxxxxx)
1 ответ
Давайте очистим ваши данные заранее от (
а также )
, Команда linux sed
хороший вариант (column -t
даст хороший формат)
sed 's/[(,)]/\t/g' data.dat | column -t > data02.dat
где мы предполагаем, что ваш оригинальный файл называется data.dat
и что мы создадим новый файл с именем data02.dat
, Новый файл будет иметь 8 столбцов. В gnuplot вы можете получить доступ к одному столбцу с опцией using ($1):($8)
использовать данные из первого столбца в качестве x и данные из восьмого столбца для y.
Теперь хитрость: определите функцию, которая будет отвечать с y, если оно удовлетворяет условию, и с плюс бесконечным, если это не так. Это потому, что gnuplot пропустит y со значениями бесконечными. Так что в gnuplot вы можете написать
myf(y,t)= t == 0 ? y : 1.0/0.
plot 'data2.dat' us ($1):(myf($2,$8))
Конечно, вы можете сделать это более компактным способом, но написать так, ИМХО, это более понятно.
Для второго вопроса можно установить другое условие в функции
myf2(x,y)= ( 0.001 > abs(x) ) && ( 0.001 > abs(y) ) ? y : 1.0/0
plot 'data2.dat' us ($1):(myf2($1,$2))
где abs(x)
возвращает абсолютное значение числа (число без знака).
Примечание: хорошо, я был ленив, а не using
Я пишу только us
, Гнуплот это понимает.