automatiser le tracé gnuplot avec bash

11

J'ai 6 fichiers qui doivent être tracés sous forme de graphiques linéaires avec des marges d'erreur et les sortir dans différents fichiers png. Le format de fichier est le suivant.

secondes moyenne moyenne min max

Comment pourrais-je tracer ces graphiques automatiquement? J'ai donc exécuté un fichier appelé bash.sh et il obtiendra les 6 fichiers et affichera les graphiques dans différents .pngfichiers. Les titres et les étiquettes des axes sont également requis.

Mintuz
la source

Réponses:

14

Si je comprends bien, c'est ce que vous voulez:

for FILE in *; do
    gnuplot <<- EOF
        set xlabel "Label"
        set ylabel "Label2"
        set title "Graph title"   
        set term png
        set output "${FILE}.png"
        plot "${FILE}" using 1:2:3:4 with errorbars
EOF
done

Cela suppose que vos fichiers se trouvent tous dans le répertoire courant. Ce qui précède est un script bash qui générera vos graphiques. Personnellement, j'écris généralement un fichier de commandes gnuplot (appelez-le, disons gnuplot_in), en utilisant un script d'une certaine forme, avec les commandes ci-dessus pour chaque fichier et tracez-le en utilisant gnuplot < gnuplot_in.

Pour vous donner un exemple, en python:

#!/usr/bin/env python3
import glob
commands=open("gnuplot_in", 'w')
print("""set xlabel "Label"
set ylabel "Label2"
set term png""", file=commands)

for datafile in glob.iglob("Your_file_glob_pattern"):
    # Here, you can tweak the output png file name.
    print('set output "{output}.png"'.format( output=datafile ), file=commands )
    print('plot "{file_name}" using 1:2:3:4 with errorbars title "Graph title"'.format( file_name = datafile ), file=commands)

commands.close()

Your_file_glob_patternest quelque chose qui décrit la dénomination de vos fichiers de données, que ce *soit ou *dat. Au lieu du globmodule, vous pouvez également l'utiliser osbien sûr. Tout ce qui génère une liste de noms de fichiers, vraiment.

Wojtek
la source
1
Votre commentaire dans votre réponse est une solution plus propre, pourquoi ne pas développer la réponse pour montrer un exemple. +1
bsd
Merci pour le commentaire. Je faisais juste cela comme vous l'avez commenté sur le post.
Wojtek
0

Solution Bash, utilisant un fichier de commande temporaire:

echo > gnuplot.in 
for FILE in *; do
    echo "set xlabel \"Label\"" >> gnuplot.in
    echo "set ylabel \"Label2\"" >> gnuplot.in
    echo "set term png" >> gnuplot.in
    echo "set output \"${FILE}.png\" >> gnuplot.in
    echo "plot \"${FILE}\" using 1:2:3:4 with errorbars title \"Graph title\"" >> gnuplot.in
done
gnuplot gnuplot.in
rouble
la source
0

Cela pourrait aider.

#set terminal postfile       (These commented lines would be used to )
#set output  "d1_plot.ps"    (generate a postscript file.            )
set title "Energy vs. Time for Sample Data"
set xlabel "Time"
set ylabel "Energy"
plot "d1.dat" with lines
pause -1 "Hit any key to continue"

Exécutez le fichier de script en tant que gnuplot filename.

Cliquez ici pour plus de détails.

lala khan
la source