Получить соотношение из 2 файлов в gnuplot
У меня есть 2 файла dat:
a.dat
#Xs
100 25
200 56
300 75
400 67
b.dat
#Xs
100 65
200 89
300 102
400 167
Я хочу нарисовать график в gnuplot, где значения yy являются отношением между значениями a.dat и b.dat соответственно. например, 25/65, 56/89, 75/102 и 67/167.
Как я это делаю? Я знаю только, чтобы сделать такой сюжет, а не с отношением.
plot "a.dat" using 1:2 with linespoints notitle
"b.dat" using 1:2 with linespoints notitle
Ответы
Ответ 1
Вы не можете объединить данные из двух разных файлов в одном выражении using
. Вы должны объединить два файла с внешним инструментом.
Самый простой способ - использовать paste
:
plot '< paste a.dat b.dat' using 1:($2/$4) with linespoints
Для решения, не зависящего от платформы, вы можете использовать, например. следующий python script, который в этом случае делает то же самое:
"""paste.py: merge lines of two files."""
import sys
if (len(sys.argv) < 3):
raise RuntimeError('Need two files')
with open(sys.argv[1]) as f1:
with open(sys.argv[2]) as f2:
for line in zip(f1, f2):
print line[0].strip()+' '+line[1],
И затем вызовите
plot '< python paste.py a.dat b.dat' using 1:($2/$4) w lp
(см. также Gnuplot: построение максимального количества двух файлов)
Ответ 2
Короткий ответ заключается в том, что... вы не можете. Gnuplot обрабатывает один файл за раз.
Обход - это использование внешнего инструмента, например. используя оболочку, если у вас есть unix-like или gnuplot.
join file1 file2 > merged_file
позволит вам легко объединить файлы, если первый столбец идентичен в обоих файлах. Параметры позволяют присоединяться к другим столбцам и управлять данными, отсутствующими в любом файле.
Если нет общего столбца, но номер строки hte имеет значение, paste
будет делать.
Ответ 3
Есть трюк, если два набора данных не подходят (разные выборки по x), но у вас есть хорошая математическая модель для хотя бы одного из них:
fit f2(x) data2 us 1:2 via ...
set table $corr
plot data1 using 2:(f2($1))
unset table
plot $corr using 1:2
Это, конечно, абсурд, если оба набора данных имеют один и тот же набор независимых переменных, потому что вы можете просто комбинировать их (см. другие ответы).