Может ли Gnuplot принимать разные аргументы во время выполнения? возможно, с Python?
У меня есть 500 файлов для построения, и я хочу сделать это автоматически. У меня есть gnuplot script
который делает строчку с именем файла жестко закодированным. Я хотел бы иметь цикл, который вызывает gnuplot на каждой итерации с другим именем файла, но, похоже, gnuplot не поддерживает аргументы командной строки.
Есть ли простой способ? Я также установил пакет gnuplot-python в случае, если я могу сделать это с помощью python script. Однако я не смог найти api, поэтому его немного сложно понять.
Спасибо!
Ответы
Ответ 1
Вы можете преобразовать gnuplot script в оболочку script, добавив строки
#!/bin/sh
gnuplot << EOF
добавление строки
EOF
и заменяя каждый $
на \$
. Затем вы можете заменить каждое появление имени файла на $1
и вызвать оболочку script с именем файла как параметром.
Ответ 2
Относительно решения $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 видит это.
Ответ 3
Простым способом является создание 500 скриптов gnuplot:
for filename in list_of_files:
outfile = open(filename + '-script', 'w')
outfile.write(script_text % (filename,))
где script_text
- это текст вашего gnuplot script с замененным именем файла %s
.
Ответ 4
Я делал это несколько раз. Но не используйте 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
сложно, но легко.
Ответ 5
Если я не понимаю ваш вопрос, есть более простой способ.
В gnuplot script замените все вхождения вашего имени файла на $0
.
Затем в bash прокрутите файлы сюжетов (скажем, они .txt файлы в $plotsDir) и вызовите gnuplot:
for f in "$plotsDir/*.txt"; do
echo "call '$f'" | gnuplot
done
Ответ 6
Вот один из способов сделать это. Ваш входной файл gnuplot, например plot.gp
, содержит строку
plot "data"
или что-то в этом роде. Сохраните строки перед этой строкой в plot1.gp
и строки после этой строки в plot2.gp
. Теперь вызовите gnuplot как
gnuplot plot1.gp -e `plot "data"` plot2.gp
который облегчает передачу имени data
в командной строке.
Ответ 7
Я создаю файл с именем test.txt
, содержащий plot [0:20] x;
Я запускаю gnuplot test.txt
, и я вижу, что gnuplot действительно прочитал содержимое моего файла, поэтому он поддерживает аргументы во время выполнения.
Ответ 8
Различные методы решения этой проблемы также рассматриваются в Как передать аргумент командной строки gnuplot?:
- Использование
-e
- Использование
-c
или call
с ARG0
подобными переменными (gnuplot >= 5)
- Использование
call
с $0
подобными переменными (gnuplot <= 4.6.6)
- Использование переменных среды и
system()
- Включение программы в gnuplot