Может ли Gnuplot принимать разные аргументы во время выполнения?может с питоном? - PullRequest
11 голосов
/ 07 декабря 2010

У меня есть 500 файлов для печати, и я хочу сделать это автоматически.У меня есть скрипт gnuplot, который выполняет построение с жестко запрограммированным именем файла.Я хотел бы иметь цикл, который вызывает gnuplot на каждой итерации с другим именем файла, но не похоже, что gnuplot поддерживает аргументы командной строки.

Есть ли простой способ?Я также установил пакет gnuplot-python на тот случай, если смогу сделать это с помощью скрипта на python. Однако я не смог найти API, поэтому его немного сложно выяснить.

Ответы [ 8 ]

22 голосов
/ 07 декабря 2010

Вы можете преобразовать свой сценарий gnuplot в сценарий оболочки, добавив строки

#!/bin/sh
gnuplot << EOF

, добавив строку

EOF

и заменив каждую $ на \$.Затем вы можете заменить каждое вхождение имени файла на $1 и вызвать сценарий оболочки с именем файла в качестве параметра.

6 голосов
/ 15 июня 2011

Относительно $ в решении Свена Марнача (строки на языке EOF называются «здесь сценарием» на языке оболочки): по моему опыту, каждый использует переменные оболочки как обычно, но $ s, которые предназначены для самого gnuplot, должны быть сбежавшим.

Вот пример:

for distrib in "uniform" "correlated" "clustered"
do
    gnuplot << EOF
    # gnuplot preamble omitted for brevity

    set output "../plots/$distrib-$eps-$points.pdf"
    set title "$distrib distribution, eps = $eps, #points = $points"

    plot "../plots/dat/$distrib-$eps-$points.dat" using 1:(\$2/$points) title "exact NN"
EOF

done

Обратите внимание на обратную косую черту, выходящую из доллара, так что gnuplot видит ее.

1 голос
/ 02 февраля 2013

Если я не понимаю ваш вопрос, есть более простой способ.

В скрипте gnuplot замените все вхождения вашего имени файла на $0.Затем в bash зациклите файлы заговора (скажем, это файлы .txt в $ plotsDir) и вызовите gnuplot:

for f in "$plotsDir/*.txt"; do
    echo "call '$f'" | gnuplot
done
1 голос
/ 18 апреля 2012

Я делал это несколько раз. Но не используйте EOF, потому что вы не можете писать на bash внутри тегов << EOF и EOF. В зависимости от имен файлов вы можете делать это разными способами. </p>

a) Если имена файлов циклические (вроде 1.dat 2.dat 3.dat и т. Д.)

#!/bin/bash    
for((i=0;i<1;i++)) do
  echo "plot '-' u 1:2"
  for((j=1;j<=3;j++)) do
     cat $i.dat
     echo "e"
  done
done | gnuplot -persist

Первый цикл является своего рода буфером для передачи всего этого в gnuplot.

b) Если имена файлов не могут быть зациклены (например, ñlasjkd.dat ajñljd.mov añlsjkd.gif), сначала необходимо переместить их в новую папку. Тогда сделай

#!/bin/bash    

ffiles=$(ls | xargs)       # a list of the folder's files
# Use the list to pipe all the data to gnuplot using cat
for((i=0;i<1;i++)) do
  echo "plot '-' u 1:2 w lp"; 
  cat $ffiles; 
  echo "e"; 
done | gnuplot -persist

в) Если вы хотите еще что-то, то есть: хранить информацию об отдельных файлах только в одном файле ... но для обслуживания таблиц данных используйте «индекс» gnuplot (если gnuplot читает две черные линии, угадайте, что другой лист данных)

#!/bin/bash

ffiles=$(ls|xargs)
ls $ffiles > ffiles.list # A file with the folder's files
while read line 
do
    cat $line; 
    echo -e; echo -e;
done < ffiles.list > alldata.dat 
# ^-feeding ffiles.list to the while loop 
# and writing the file alldata.dat

теперь вы можете перейти к gnuplot и получить доступ к одной таблице

plot 'alldata.dat' index 1 u 1:2

и вы увидите первый файл, появившийся в списке "ffiles.list". Если вы хотите увидеть более одного, скажите 4

plot 'alldata.dat' index 1:4 u 1:2

хитро, но легко.

1 голос
/ 07 декабря 2010

Простой способ - создать 500 сценариев gnuplot следующим образом:

for filename in list_of_files:
    outfile = open(filename + '-script', 'w')
    outfile.write(script_text % (filename,))

, где script_text - текст вашего сценария gnuplot, имя файла которого заменено на %s.

0 голосов
/ 14 июля 2016

Различные методы решения этой проблемы также описаны в Как передать аргумент командной строки в gnuplot? :

  • Использование -e
  • Использование -c или call с ARG0 подобными переменными (gnuplot> = 5)
  • Использование call с $0 подобными переменными (gnuplot <= 4.6.6) </li>
  • Использование переменных окружения и system()
  • Передача программы в gnuplot
0 голосов
/ 07 декабря 2010

Я создаю файл с именем test.txt, содержащий plot [0:20] x;

Я запускаю gnuplot test.txt и вижу, что gnuplot действительно прочитал содержимое моего файла, поэтому он поддерживает аргументы во время выполнения.

0 голосов
/ 07 декабря 2010

Вот один из способов сделать это. Ваш входной файл gnuplot, скажем plot.gp, содержит строку

plot "data"

или что-то в этом роде. Сохраните строки до этой строки в plot1.gp и строки после этой строки в plot2.gp. Теперь вызовите gnuplot как

gnuplot plot1.gp -e `plot "data"` plot2.gp

, что облегчает передачу имени data в командной строке.

...