2013-11-19 1 views
10

У меня есть 2 Дат файлов:Получить соотношение от 2 файлов в Gnuplot

a.dat 
#Xs 
100 25 
200 56 
300 75 
400 67 


b.dat 
#Xs 
100 65 
200 89 
300 102 
400 167 

Я хочу, чтобы нарисовать график в Gnuplot, где значение уу представляют собой соотношение между значениями 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 

ответ

14

Вы не можете объединить данные из двух разных файлов в одном using заявлении. Вы должны объединить два файла с внешним инструментом.

Самый простой способ заключается в использовании paste:

plot '< paste a.dat b.dat' using 1:($2/$4) with linespoints 

Для независимого от платформы решение, которое вы могли бы использовать, например, следующий питон скрипт, который в данном случае делает то же самое:

"""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: plotting the maximum of two files)

+0

Я люблю numpy столько, сколько следующий парень, но я думаю, что это использование здесь немного чрезмерно. Вы можете сделать то же самое с «ванильным» python «zip'ing 2 файловыми объектами». – mgilson

+0

@mgilson Вы правы, я добавил возможную реализацию 'paste.py' с python 'vanilla'. Не стесняйтесь исправить это! Это также имеет то преимущество, что он намного более гибкий, чем реализация «numpy», поскольку он не анализирует файлы перед их объединением. – Christoph

+1

+1 для портативного решения. Начиная с python [2.7] (http://docs.python.org/dev/whatsnew/2.7.html#other-language-changes) и [3.1] (https://docs.python.org/3.1/reference/compound_stmts .html # с), можно комбинировать выражения 'with', поэтому вы можете делать' с open (sys.argv [1]) как f1, open (sys.argv [2]) как f2: 'и уменьшать уровень гнездования. –

3

Короткий ответ в том, что ... вы не можете. Gnuplot обрабатывает один файл за раз.

Обходной способ заключается в использовании внешнего инструмента, например. используя оболочку, если у вас есть unix-like или gnuplot.

join file1 file2 > merged_file позволит вам легко объединить файлы, если первый столбец идентичен в обоих файлах. Параметры позволяют присоединяться к другим столбцам и управлять данными, отсутствующими в любом файле.

В случае, если нет общей колонки, но номер строки hte имеет значение, paste будет делать.

0

Существует трюк, если два набора данных не подходят (иной выборки в х), но у вас есть хорошая математическая модель, по крайней мере, одного из них:

fit f2(x) data2 us 1:2 via ... 
set table $corr 
plot data1 using 2:(f2($1)) 
unset table 

plot $corr using 1:2 

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

Смежные вопросы