Comment tracer des données sans fichier séparé en spécifiant tous les points à l'intérieur du script Gnuplot?
mon programme génère des scripts bash qui appellent gnuplot. Je ne veux pas avoir à faire un fichier supplémentaire pour stocker les données; est il possible que je peux appeler explicitement toutes les valeurs? Ou peut-être que bash ferait un dossier temporaire.
quelque chose comme
plot {(1,5),(2,10),(3,1)}
est ce que je cherche.
4 réponses
vous pouvez utiliser la syntaxe pour inline data - filename '-'
.
l'exemple suivant produit un tracé simple dans une image GIF
("script 151930920"):
gnuplot << EOF
set terminal gif
set output 'plot1.gif'
plot '-' using 1:2
1 10
2 20
3 32
4 40
5 50
e
EOF
Gnuplot 5.0.1 datablocks bien travailler pour que:
$data << EOD
1 5
2 10
3 1
EOD
plot "$data"
cette méthode est un peu plus polyvalente que '-'
car elle permet de réutiliser plus facilement les mêmes données plusieurs fois, y compris sur la même commande plot
: https://stackoverflow.com/a/33064402/895245
Version 5 est disponible sur Ubuntu 15.04, ou compiler à partir de la source avec: https://askubuntu.com/a/684136/52975
vous pouvez également être intéressé par les noms de fichiers spéciaux +
et ++
lorsque vous traquez avec des fonctions.
exemple d'utilisation de shell avec pipeline,
gnuplot -p <(echo -e 'plot "-"\n1 1\ne')
bash Une ligne de ping graphique avec gnuplot
Désolé, ce n'est pas la lumière (361 caractères):
gnuplot -p -e "set xdata time;set timefmt '%s';set xrange [ '$(date +%s)' : '$(date -d 'now +30 seconds' +%s)' ];plot '-' using 1:2 with line title 'ping google';" < <(( ping -c 30 -n google.com| sed -u 's/^64.*time=\([0-9.]\+\) .*$//p;d' | tee >(sed -u 's/.*/now/'| stdbuf -oL date -f - +d%s)) | sed -u 'N;s/\n/ /;s/\([0-9.]\+\) d\([0-9]\+\) */ /;s/d//')
L'exécution de cette ligne tiendra votre terminal pendant 30 secondes, que le tracé à l'écran d'un graphique présentant le retard de ping à google.com sur les 30 dernières secondes.
la même ligne pourrait être fendue comme ceci (réalisable aussi):
gnuplot -p -e "
set xdata time;
set timefmt '%s';
set xrange [ '$(
date +%s
)' : '$(
date -d 'now +30 seconds' +%s
)' ];
plot '-' using 1:2 with line title 'ping google';
" < <((
ping -c 30 -n google.com |
sed -u 's/^64.*time=\([0-9.]\+\) .*$//p;d' |
tee >(sed -u 's/.*/now/'| stdbuf -oL date -f - +d%s)) |
sed -u 'N;s/\n/ /;s/\([0-9.]\+\) d\([0-9]\+\) */ /;s/d//'
)
mais ce ne pas imprimer les valeurs!
donc j'ai ajouté quelques octets:
gnuplot -p -e "set xdata time;set timefmt '%s';set xrange [ '$(date +%s)' : '$(date -d 'now +30 seconds' +%s)' ];plot '-' using 1:2 with line title 'ping google';" < <(( ping -c 30 -n google.com| sed -u 's/^64.*time=\([0-9.]\+\) .*$//p;d' | tee >(sed -u 's/.*/now/'| stdbuf -oL date -f - +d%s) ) | sed -u 'N;s/\n/ /;s/\([0-9.]\+\) d\([0-9]\+\) */ /;s/d//' | tee >(printf "%(%T)T %s\n" $(</dev/stdin) | column -c $COLUMNS >&2 ))
Cela peut créer une fenêtre comme ceci:
et simultanément imprimer sur terminal:
17:58:53 19.6 17:59:00 124 17:59:07 159 17:59:13 194 17:59:19 17.1
17:58:54 18.7 17:59:02 19.4 17:59:08 20.3 17:59:14 16.8 17:59:20 20.0
17:58:55 17.9 17:59:03 180 17:59:09 76.4 17:59:15 48.9 17:59:21 192
17:58:57 115 17:59:04 186 17:59:10 226 17:59:16 221 17:59:22 17.1
17:58:58 18.5 17:59:05 16.8 17:59:11 109 17:59:17 19.0
17:58:59 17.0 17:59:06 184 17:59:12 18.8 17:59:18 18.7
Ré-écrit coupée en deux:
gnuplot -p -e "
set xdata time;
set timefmt '%s';
set xrange [ '$(date +%s)' : '$(date -d 'now +30 seconds' +%s)' ];
plot '-' using 1:2 with line title 'ping google';" < <(
(
ping -c 30 -n google.com |
sed -u 's/^64.*time=\([0-9.]\+\) .*$//p;d' |
tee >(sed -u 's/.*/now/'| stdbuf -oL date -f - +d%s)
) | sed -u 'N;s/\n/ /;s/\([0-9.]\+\) d\([0-9]\+\) */ /;s/d//' |
tee >(printf "%(%T)T %s\n" $(</dev/stdin) |
column -c $COLUMNS >&2 )
)