tipo script letra grafica error ejemplos ejecutar desde barras gnuplot

letra - script gnuplot



¿Cómo trazar datos sin un archivo separado especificando todos los puntos dentro de la secuencia de comandos Gnuplot? (4)

Mi programa genera scripts de bash que llaman gnuplot. No quiero tener que hacer un archivo extra para almacenar los datos; ¿Hay alguna manera en que pueda llamar explícitamente a todos los valores? O posiblemente tener a bash hacer un archivo temporal.

Algo como

plot {(1,5),(2,10),(3,1)}

es lo que estoy buscando.


bash una línea de ping gráfico con gnuplot

Lo sentimos, no es luz (361 caracteres):

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.]/+/) .*$//1/p;d'' | tee >(sed -u ''s/.*/now/''| stdbuf -oL date -f - +d%s)) | sed -u ''N;s//n/ /;s//([0-9.]/+/) d/([0-9]/+/) *//2 /1/;s/d//'')

La ejecución de esta línea mantendrá su terminal durante 30 segundos, luego de trazar en pantalla un gráfico que presenta el retraso de ping a google.com en los últimos 30 segundos.

La misma línea podría dividirse de esta manera (también es factible):

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.]/+/) .*$//1/p;d'' | tee >(sed -u ''s/.*/now/''| stdbuf -oL date -f - +d%s)) | sed -u ''N;s//n/ /;s//([0-9.]/+/) d/([0-9]/+/) *//2 /1/;s/d//'' )

¡Pero esto no imprime valores!

Así que he añadido algunos bytes:

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.]/+/) .*$//1/p;d'' | tee >(sed -u ''s/.*/now/''| stdbuf -oL date -f - +d%s) ) | sed -u ''N;s//n/ /;s//([0-9.]/+/) d/([0-9]/+/) *//2 /1/;s/d//'' | tee >(printf "%(%T)T %s/n" $(</dev/stdin) | column -c $COLUMNS >&2 ))

Esto puede crear una ventana como esta:

E imprimir simultáneamente en el 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

Reescrito dividido:

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.]/+/) .*$//1/p;d'' | tee >(sed -u ''s/.*/now/''| stdbuf -oL date -f - +d%s) ) | sed -u ''N;s//n/ /;s//([0-9.]/+/) d/([0-9]/+/) *//2 /1/;s/d//'' | tee >(printf "%(%T)T %s/n" $(</dev/stdin) | column -c $COLUMNS >&2 ) )


Ejemplo de uso de shell con pipeline,

gnuplot -p <(echo -e ''plot "-"/n1 1/ne'')


Puede utilizar la sintaxis para los datos en línea - nombre ''-'' archivo ''-'' .

El siguiente ejemplo produce un gráfico simple en una imagen GIF (script bash ):

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


Los bloques de datos de Gnuplot 5.0.1 funcionan bien para eso:

$data << EOD 1 5 2 10 3 1 EOD plot "$data"

Este método es un poco más versátil que ''-'' ya que facilita la reutilización de los mismos datos varias veces, incluido el mismo comando de plot : https://.com/a/33064402/895245

La versión 5 está disponible en Ubuntu 15.04, o compilar desde la fuente con: https://askubuntu.com/a/684136/52975

También puede interesarle los nombres de archivo especiales + y ++ al trazar con funciones.