Структура петлі всередині gnuplot?


82

Чи є спосіб ітеративного отримання даних з декількох файлів та побудови їх на одному графіку в gnuplot. Припустимо, у мене є такі файли, як data1.txt, data2.txt ...... data1000.txt; кожна з яких має однакову кількість стовпців. Тепер я міг написати щось на зразок-

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.


Дійсно затишна bashфункція у відповіді нижче
Хастур

Відповіді:


96

Напевно є (у 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циклу.


Дякую, що для вас спрацював "графік для [i = 1: 1000] 'data'.i.'. Txt 'з використанням заголовка 1: 2" Flow' .i ".. Я використовую gnuplot 5.2 із C ++ у Windows .. ..
MasoodRehman

Але у мене є інша проблема, я пишу програму, яка записує K-кількість файлів на жорсткий диск через fream. K - це глобальна змінна, тому я хочу побудувати K-кількість файлів на своєму графіку за допомогою gnuplot, який я намагався [i = 1 : K], але це дає помилку невизначеної змінної. Я спробував зовні для циклу з gnuplot, але це також не працює.
MasoodRehman

Я написав функцію на C ++ для gnuplot, яка працює з для [i = 1: 5], але коли я використовую для for [i = 1: K], це видає помилку ...
MasoodRehman

@MasoodUrRehman, здається, ви намагаєтесь використовувати змінну з вашого коду C ++ у своєму скрипті gnuplot; переконайтеся, що ви надрукували значення змінної K, коли надсилаєте команди gnuplot. Gnuplot каже "невизначена змінна", оскільки C ++ знає, що таке K, але gnuplot ні. Якщо ви все ще застрягли, може бути добре опублікувати свою проблему як окреме запитання на C ++.
andyras

83

Погляньте також на 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
Чи можу я також використовувати ітератор t для посилання на індекс у масиві, наприклад, імен файлів або кольорів?
tommy.carstensen

1
Я ніколи не пробував, але не бачу в цьому жодної проблеми. Зрештою, інша можливість полягає в тому, щоб вказати елементи масиву (кольори, імена чи що завгодно) безпосередньо у квадратних дужках, як показано в help do.
DarioP

1
Я задав нове запитання тут stackoverflow.com/questions/18591986/loop-over-array-in-gnuplot , тому що для мене не очевидно, як цього можна досягти.
tommy.carstensen

10

У мене є сценарій 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свій домашній каталог і вуаля. Ви можете побудувати всі файли в будь-якому каталозі, набравши p і enter.

EDIT Я змінив команду, оскільки вона не спрацювала. Раніше він містив list(i)=word(system(ls -1B *.dat),i).


Для мене ваш код не працює. Мені довелося писати list=system(ls -1B *.dat)натомість.
Jaxan

Хм, добре. Я був у версії 4.6 на Linux.
Jonatan Öström

1
Тож я спробував ще раз, і, як ти кажеш, це не працює. Мені довелося використовувати одинарні лапки в системному дзвінку, щоб ваша команда працювала:list=system('ls -1B *.dat')
Jonatan Öström

у мене це не працює. з цитатами або без них. чому?
samira

@samira Я не знаю.
Jonatan Öström

5

Використовуйте наступне, якщо у вас є дискретні стовпці, щоб побудувати графік у графіку

do for [indx in "2 3 7 8"] {
  column = indx + 0
  plot ifile using 1:column ;  
}

1
Тут наведено лише приклад, який показує, як прокручувати не послідовні числа.
rehctawrats

2

Я хотів використовувати узагальнюючі символи для побудови декількох файлів, часто розміщених у різних каталогах, працюючи з будь-якого каталогу. Рішенням, яке я знайшов, було створення наступної функції в~/.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.


Ви можете додати, plo() { [[ $# -eq 0 ]] && echo "Usage plo file1 file2 ..." || { .... } }щоб уникнути дзвінка gnuplotбез файлів.
Хастур

0

Ось альтернативна команда:

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.