Eu quero usar o gnuplot para desenhar figuras do arquivo de dados, digamos foo.data . Atualmente, codifiquei o nome do arquivo de dados no arquivo de comando, digamos foo.plt , e executei o comando gnuplot foo.plg
para plotar dados. No entanto, quero passar o nome do arquivo de dados como um argumento de comando, por exemplo, executando o comando gnuplot foo.plg foo.data
. Como analisar os argumentos da linha de comando no arquivo de script gnuplot? Obrigado.
fonte
if
para fornecer padrões.if ! exists("filename") filename='default.data'
if (!exists("filename")
vez deif ! exists("filename")
.-e
argumento, por exemplo,-e "filename='default.data'; foo='bar'"
ou-e "filename='default.data'" -e "foo='bar"'
.-e ...
opção precisa preceder o nome do arquivo. De fatoman gnuplot
, podemos ler:-e
"lista de comandos" executa os comandos solicitados antes de carregar o próximo arquivo de entrada . .Você pode passar argumentos para um script gnuplot desde a versão 5.0, com a flag
-c
. Esses argumentos são acessados pelas variáveisARG0
paraARG9
,ARG0
sendo o script eARG1
paraARG9
variáveis de cadeia. O número de argumentos é dado porARGC
.Por exemplo, o seguinte script ("script.gp")
pode ser chamado como:
ou dentro do gnuplot como
No gnuplot 4.6.6 e versões anteriores, existe um
call
mecanismo com uma sintaxe diferente (agora obsoleta). Os argumentos são acessados através$#
,$0
, ...,$9
. Por exemplo, o mesmo script acima se parece com:e é chamado dentro do gnuplot como (lembre-se, versão <4.6.6)
Observe que não há variável para o nome do script, assim
$0
como o primeiro argumento, e as variáveis são chamadas entre aspas. Não há como usar isso diretamente da linha de comando, apenas através de truques como o sugerido por @ con-fu-se.fonte
-c
switch com um script que contém linhas comoplot 'data' using 0:($1/100)
.gnuplot
morre com o erro expressão inválida porque$1
desapareceu. Onde eu estou errado? Observe que-c
, sem , o script é executado com êxito.gnuplot 5.0
adicionando a esses exemplos uma linha comoplot 'data' using 0:($1/100)
, e não entendi o que você diz. Seria raro, já que esta versão define as variáveisARG0
-ARG9
e não$1
-$9
. Presumo que você também tenha a versão 5.0 (não é?), Pois o-c
sinalizador não é suportado por versões anteriores. Eu precisaria ver um roteiro mínimo para ver onde está o problema real: /gnuplot 5.0 patchlevel 0
sob o cygwin . O script de uma linhaprint ARG1; plot 'data' using 0:($1/100)
imprime corretamente o valor passado comoARG1
e sai com a expressão inválida de erro apontando para a barra deprint ARG1; plot 'data' using 0:(/100)
.Você também pode passar informações pelo ambiente, conforme sugerido aqui . O exemplo de Ismail Amin é repetido aqui:
No shell:
Em um script Gnuplot:
fonte
name=plot_data_file ./the_gnuplot_script
.name=value command
diz ao shell para executar o comando com essa variável específica em seu ambiente. Estou usando o bash 4.3.11, mas acredito que é um recurso de shell muito comum.A resposta de Jari Laamanen é a melhor solução. Quero apenas explicar como usar mais de 1 parâmetro de entrada com variáveis de shell:
e foo.plg:
Como você pode ver, mais parâmetros são passados com ponto-e-vírgula (como nos scripts bash), mas as variáveis de string precisam ser encapsuladas com '' (sintaxe gnuplot, sintaxe NOT Bash)
fonte
'
ou"
para strings. As aspas externas ao redor do-e
argumento devem ser"
para que as variáveis bash sejam substituídas. O seguinte também funciona bem:OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"
Você pode usar truques no ambiente unix / linux:
no programa gnuplot: plot "/ dev / stdin" ...
Na linha de comando: gnuplot program.plot <data.dat
fonte
Esta pergunta está bem respondida, mas acho que posso encontrar um nicho para preencher aqui, independentemente, apenas para reduzir a carga de trabalho em alguém pesquisando isso no Google, como eu fiz. A resposta do vagoberto me deu o que eu precisava para resolver minha versão deste problema e, portanto, vou compartilhar minha solução aqui.
Desenvolvi um script de plotagem em um ambiente atualizado, o que me permitiu:
Isso executa perfeitamente bem da linha de comando em um ambiente com um gnuplot recente (5.0.3 no meu caso).
Quando carregado no meu servidor e executado, ele falhou porque a versão do servidor era 4.6.4 (atual no Ubuntu 14.04 LTS). O calço abaixo resolveu esse problema sem exigir nenhuma alteração no script original.
A combinação desses dois scripts permite que os parâmetros sejam transmitidos dos scripts bash para gnuplot sem levar em consideração a versão do gnuplot e basicamente qualquer * nix.
fonte
Você pode até fazer alguma mágica de shell, por exemplo:
Minha implementação é um pouco mais complexa (por exemplo, substituindo alguns tokens mágicos na chamada sed, enquanto eu já estou nela ...), mas simplifiquei este exemplo para entender melhor. Você também pode torná-lo ainda mais simples ... YMMV.
fonte
No shell, escreva
e consecutivamente os arquivos que você deseja. -persist é usado para fazer a tela do gnuplot permanecer enquanto o usuário não sair dela manualmente.
fonte
gnuplot -persist -c "myscript.plt" "mydata.csv" "myoutput.png"
esse comando funciona bem e eu recebo o arquivo "myoutput.png" conforme o esperado, mas a tela do gnuplot não aparece (exit
comando NO no myscript.plt). Por quê? E como fazer a tela do gnuplot aparecer no meu exemplo?Ainda outra maneira é esta:
Você tem um script gnuplot chamado
scriptname.gp
:Agora você pode chamar o script gnuplot
scriptname.gp
com esta paz de sintaxe complicada:fonte
A resposta de @ vagoberto parece a melhor IMHO se você precisar de argumentos posicionais , e eu tenho uma pequena melhoria a acrescentar.
sugestão de vagoberto:
chamado por:
para aqueles tipógrafos preguiçosos como eu, é possível tornar o script executável (
chmod 755 script.gp
)depois use o seguinte:
e execute-o como:
fonte