Получить соотношение из 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

Это, конечно, абсурд, если оба набора данных имеют один и тот же набор независимых переменных, потому что вы можете просто комбинировать их (см. другие ответы).