2013-02-18 2 views
72

Есть ли способ итеративно извлекать данные из нескольких файлов и строить их на одном графике в gnuplot. Предположим, у меня есть файлы, такие как data1.txt, data2.txt ...... data1000.txt; каждый из которых имеет одинаковое количество столбцов. Теперь я мог бы написать что-то вроде:Структура петли внутри gnuplot?

plot "data1.txt" using 1:2 title "Flow 1", \ 
    "data2.txt" using 1:2 title "Flow 2", \ 
     . 
     . 
     . 
    "data1000.txt" using 1:2 title "Flow 6" 

Но это было бы действительно неудобно. Мне было интересно, есть ли способ прорезать участок в gnuplot.

+0

Действительно уютный 'bash' функция в [ответить ниже] (http://stackoverflow.com/a/34913776/3569208) – Hastur

ответ

82

Там уверенный (в Gnuplot 4.4 и выше):

plot for [i=1:1000] 'data'.i.'.txt' using 1:2 title 'Flow '.i 

Переменная i можно интерпретировать как переменную или строку, так что вы могли бы сделать что-то вроде

plot for [i=1:1000] 'data'.i.'.txt' using 1:($2+i) title 'Flow '.i 

если вы хотите для смещения линий друг от друга.

Тип help iteration в командной строке gnuplot для получения дополнительной информации.

Также не забудьте увидеть ответ @ DarioP о синтаксисе do for; что дает вам что-то ближе к традиционному циклу for.

+0

Спасибо ваше решение«участок для [i = 1: 1000] 'data'.i.'. txt 'с использованием заголовка 1: 2 «Flow» .i «работал для меня .. Я использую gnuplot 5.2 с C++ для Windows ... – MasoodUrRehman

+0

Но у меня есть другая проблема, я пишу программу, которая пишет K количество файлов на жестком диске с помощью fream K является глобальной переменной, поэтому я хочу построить K количество файлов на моем графике, используя gnuplot, который я пробовал для [i = 1: K] но он дает ошибку неопределенной переменной. Я пробовал снаружи для цикла из gnuplot, но это также не работает. – MasoodUrRehman

+0

Я написал функцию в C++ для gnuplot, которая работает с для [i = 1: 5], но когда я использую for для [i = 1: K], она дает ошибку ... – MasoodUrRehman

70

Посмотрите также к команде do { ... } так Gnuplot 4.6, поскольку это очень мощный:

do for [t=0:50] { 
    outfile = sprintf('animation/bessel%03.0f.png',t) 
    set output outfile 
    splot u*sin(v),u*cos(v),bessel(u,t/50.0) w pm3d ls 1 
} 

http://www.gnuplotting.org/gnuplot-4-6-do/

+1

Удивительный! Я не могу поверить, что я первый человек, который нашел этот ответ полезным! Благодаря! –

+1

Могу ли я также использовать итератор t для ссылки на индекс в массиве, например, имен файлов или цветов? –

+1

Я никогда не пробовал, но я не вижу никаких проблем с этим. В конце концов, другая возможность заключается в том, чтобы указать элементы массива (цвета, имена или что-то еще) прямо в квадратных скобках, как показано в 'help do'. – DarioP

8

У меня есть сценарий all.p

set ... 
... 
list=system('ls -1B *.dat') 
plot for [file in list] file w l u 1:2 t file 

Здесь два последние строки являются буквальными, а не эвристическими. Тогда я бег

$ gnuplot -p all.p 

Изменения *.dat к типу файла, который вы имеете, или добавить типы файлов.

Следующий шаг: Добавить в ~/.bashrc этой линии

alias p='gnuplot -p ~/./all.p' 

и поместите файл all.p Int свой домашний каталог и вуаля. Вы можете отобразить все файлы в любом каталоге, набрав p и введите.

EDIT Я изменил команду, потому что она не сработала. Ранее он содержал list(i)=word(system(ls -1B *.dat),i).

+0

Для меня ваш код не работает. Я должен был написать 'list = system (ls -1B * .dat)' вместо этого. – Jaxan

+0

Хм, хорошо. Я был в версии 4.6 на Linux. –

+1

Так что я попробовал еще раз, и, как вы говорите, он не работает. Мне пришлось использовать одиночные кавычки внутри системного вызова для вашей команды: 'list = system ('ls -1B * .dat')' –

1

Я хотел использовать подстановочные знаки для создания нескольких файлов, часто размещаемых в разных каталогах, работающих в любом каталоге. Решение я нашел в том, чтобы создать следующую функцию в ~/.bashrc

plo() { 
local arg="w l" 
local str="set term wxt size 900,500 title 'wild plotting' 
set format y '%g' 
set logs 
plot" 
while [ $# -gt 0 ] 
     do str="$str '$1' $arg," 
     shift 
done 
echo "$str" | gnuplot -persist 
} 

и использовать его, например, например plo *.dat ../../dir2/*.out, для построения всех файлов .dat в текущем каталоге и всех .out файлов в каталоге, который является уровнем вверх и называется dir2.

+0

Вы можете добавить 'plo() {[[$ # -eq 0]] && echo" Использование plo file1 file2 ... "|| {....}} ', чтобы избежать вызова' gnuplot' без файлов. – Hastur

0

Вот альтернативная команда:

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines' 
Смежные вопросы