Может ли Gnuplot принимать разные аргументы во время выполнения? возможно, с Python?

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

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

Спасибо!

8 ответов

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

#!/bin/sh
gnuplot << EOF

добавление строки

EOF

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


Относительно решения $Sven Marnach (линии между EOF называются "здесь script" в языке оболочки): по моему опыту, как обычно, используются переменные оболочки, но $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 видит это.


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

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

for f in "$plotsDir/*.txt"; do
 echo "call '$f'" | gnuplot
done


Простым способом является создание 500 скриптов gnuplot:

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

где script_text - это текст вашего gnuplot script с замененным именем файла %s.


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

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), сначала необходимо перенести их в новую папку. Тогда do

#!/bin/bash 
ffiles=$(ls | xargs) # a list of the folder 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

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

#!/bin/bash
ffiles=$(ls|xargs)
ls $ffiles > ffiles.list # A file with the folder 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

сложно, но легко.


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

  • Использование -e
  • Использование -c или call с ARG0 подобными переменными (gnuplot >= 5)
  • Использование call с $0 подобными переменными (gnuplot <= 4.6.6)
  • Использование переменных среды и system()
  • Включение программы в gnuplot


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

plot "data"

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

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

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


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

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

licensed under cc by-sa 3.0 with attribution.