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.

26

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
34
répondu gimel 2010-07-23 14:05:20

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.

15

exemple d'utilisation de shell avec pipeline,

gnuplot -p <(echo -e 'plot "-"\n1 1\ne')
3
répondu Allen 2012-06-13 04:08:01

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:

enter image description here

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 )
)
1
répondu F. Hauri 2016-10-20 16:10:15