ejemplos - gnuplot oficial
gnuplot stdin, ¿cómo trazar dos líneas? (9)
¿Has probado chart ? Su caso sería tan fácil como:
cat test | chart line '',''
Y te daría:
Estoy tratando de producir una gráfica con dos líneas usando datos tomados de stdin. Tengo un archivo "test.csv":
0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6
He estado tratando de trazar esto con comandos como,
$ cat test | gnuplot -p -e "set datafile separator /",/"; plot ''-'' using 1:2 with lines, '''' using 1:3 with lines;"
Pero no importa lo que intente lo consigo,
line 5: warning: Skipping data file with no valid points
Supongo que esto se debe a que para la segunda línea, la entrada estándar ya se ha agotado. ¿Hay alguna manera de hacer que gnuplot tome datos de cada columna de la entrada estándar para diferentes gráficos?
Gracias.
El "-" se utiliza para especificar que los datos siguen el comando de trazado. Así que si lo usas, necesitarás hacer algo como:
echo "set datafile separator /",/"; plot ''-'' using 1:2 with lines, '''' using 1:3 with lines;" | cat - datafile.dat | gnuplot -p
(Citar arriba probablemente necesita ser escapado).
Lo que estás buscando es esto:
plot ''< cat -''
Ahora, puedes hacer:
cat test | sed ... | gnuplot -p "plot ''< cat -'' using ..."
Tenga en cuenta que es posible que deba ingresar los datos de entrada a través de stdin varias veces si está usando opciones con plot, así:
cat testfile testfile | gnuplot -p "plot ''< cat -'' using 1, '''' using 2"
En el caso anterior, el archivo de prueba debe terminar con una línea que tenga el único carácter ''e'' en ella.
Gnuplot puede leer desde la entrada estándar, pero para cada declaración de trazado, se requiere un nuevo conjunto de datos. Lo siguiente funciona bien:
cat test.csv | gnuplot -p -e "set datafile separator '',''; plot ''-'' using 1:2 w l"
El error aparece tan pronto como agrega el segundo comando de trazado con , '''' using 1:3
. Para ello, debe enviar los datos de nuevo, ya que el primer conjunto de datos no se almacena de forma interna para su reutilización. Así que para ustedes dos comandos de trazado, el siguiente fragmento de código funciona bien:
echo ''e'' | cat test.csv - test.csv | gnuplot -p -e "set datafile separator '',''; plot ''-'' using 1:2 w l, '''' using 1:3 w l"
Eso escribe el archivo de datos dos veces, separados por una e
que indica el final de los datos para el primer comando de trazado.
Intentaría convertir el archivo csv al espacio separado (suponiendo que ninguno de los registros abarcan varias líneas) canalizándolo a través de sed
lugar de establecer el separador:
cat test | sed ''s/,/ /g'' | gnuplot -p -e "plot ''-'' using ..."
Me las arreglé para solucionar esto enviando los datos dos veces, terminados por am "e" en su propia línea después de cada bloque. Por lo que su entrada debe ser como
set datafile separator ","; plot ''-'' using 1:2 with lines, '''' using 1:3 with lines
0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6
e
0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6
e
Para mí esto funciona cuando lo hago:
set datafile separator '',''
plot "test.csv" using 1:2 with lines
Parece que usaste "," para el separador de archivos de datos en lugar de '',''
Tal vez esta sea una pregunta antigua, pero he encontrado una solución interesante basada en las otras respuestas:
cat filename | awk -- ''{print $0} END{print "e"}'' | tee -i -a - -
La salida sería:
"contents of filename"
e
"contents of filename"
e
"contents of filename"
e
Ahora, cat
y awk
funcionan de la manera habitual, por otro lado, el tee
utilidad nos permite copiar la salida estándar canalizada desde el comando anterior a un archivo, pero este archivo puede ser estándar, por lo que podemos hacer muchas copias, especificando n tiempos -
después de -a
.
La opción -i
deja de ser interrumpida por las señales durante la copia, -a
le dice que agregue la entrada a la entrada estándar sin sobrescribir y luego escriba todo en stdout .
Para referencia, eche un vistazo a la utilidad T
Tuve que hacer lo siguiente, ya que agregar ''-'' no funcionó para mí:
cat filename | awk -- ''{print $0} END{print "e"}'' | tee -i -a /dev/stdout /dev/stdout
gnuplot parece necesitar acceso aleatorio (es decir, no estándar), así que creo que estás atascado con
# explicitly open "test" file
$ gnuplot -p -e "set datafile separator /",/"; plot ''test'' using 1:2 with lines, '''' using 1:3 with lines;"