2012-05-22 2 views
2

У меня есть два файла A и B. Оба файла содержат 2 столбца, x и y.Разница сюжета gnuplot из 2 столбцов

Теперь я хочу построить график для x vs (yA - yB). Предоставляет ли gnuplot команду для этого?

Еще одна вещь, скажем, xA и xB не такие. Как мне построить график, где ось х содержит все элементы, которые находятся в обоих, xA и xB и ось y - это разность - это соответствующие y-компоненты?

+0

ли XA и XB элементы всегда * точно * соответствия, вплоть до го e символов? Или может быть объединено 5.0000 с 5.0001? –

+0

они точно такие же. столбец слияния представляет собой целое число без знака. –

+0

«все элементы, которые находятся в обоих» - это (для меня) неоднозначно. Вы хотите союз или перекресток? Похоже, вы хотите пересечение, но если вы хотите союз, я предоставил решение для этого ниже. – mgilson

ответ

5

Во-первых, препроцессировать файлы с join в Баш:

join <(sort -k1,1 file1) <(sort -k1,1 file2) > file3 

Сортировка файлов имеет важное значение, в противном случае join не будет работать.

Затем вы можете использовать результат, чтобы нарисовать график:

plot '< sort -n file3' using 1:($2-$3) with lines 

Опять же, цифровая сортировка необходима здесь, поскольку join использует буквенно-цифровую сортировку, которая делает линия пересекается друг с другом.

+0

* Если * это оказывается медленным (3 сортировки) для больших данных, скрипт perl/Python может быть лучше. Кроме того, не могли ли первые два сортировки быть числовыми и тем самым избежать третьего сортировки? –

+0

@PhilH: К сожалению, 'join' нуждается в алфавитно-цифровой сортировке (как уже упоминалось). Попробуйте это посмотреть. Если есть какие-либо осложнения, я бы также предложил более продвинутый язык (Perl в моем случае). – choroba

2

Я думаю, что это может быть хорошая работа для paste.

plot "<paste A B" u 1:($2-$4) w points #whatever line style you want... 
        #xA #yA-yB 

Для файла, где хА! = Хв, я немного неясно, хотите ли вы, чтобы построить только набор точек с являются общими для обоих (пересечение двух множеств) или вы хотите построим все точки (объединение множеств). Объединение легко:

plot "<paste A B" u 1:($2-$4) w points ls 1,\ 
    "<paste A B" u 3:($2-$4) w points ls 1 

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

с помощью Python, хотя, это не так уж плохо ...

#joinfiles.py 
import sys 
f1=sys.argv[1] 
f2=sys.argv[2] 
xA,yA=zip(*[map(float,line.split()) for line in f1.readlines()]) 
xB,yB=zip(*[map(float,line.split()) for line in f2.readlines()]) 
f1.close() 
f2.close() 
for i,x in enumerate(xA): 
    if(x in xB): 
     sys.stdout.write('%f %f %f\n'%(x,yA[i],yB[i])) 

, а затем из Gnuplot:

plot "<python joinfiles.py A B" u 1:($2-$3) #... 
Смежные вопросы