Gnuplot: ¿cómo trazar con una línea continua sobre múltiples bloques de datos?
Tengo un archivo dat que se divide en varios bloques, por ejemplo, como el siguiente:
# Time (s) x (m)
0.0 0.0
1.0 1.0
2.0 2.0
3.0 3.0
4.0 4.0
5.0 5.0
5.0 10.0
6.0 11.0
7.0 12.0
8.0 13.0
9.0 14.0
10.0 15.0
El siguiente guión mínimo:
filename = 'test.dat';
set terminal pngcairo size 960, 540 font 'Verdana, 20'
set output "test.png"
unset key
set xlabel "Time (s)"
set ylabel "x (m)"
set grid
set autoscale fix
plot filename u 1:2 w l lw 1.0 lc rgb 'black' notitle
produce esta figura:
Gnuplot traza dos líneas, una para cada bloque. Sin embargo, dado que los datos x son discontinuos entre los dos bloques, aparece un salto en la gráfica.
Me gustaría unir estas dos líneas en el gráfico de salida, sin modificar el archivo de datos. ¿Hay alguna forma de hacer esto?
Tal vez se pueda hacer leyendo la última línea de cada bloque y la primera del siguiente bloque y trazando una línea entre esos dos puntos, pero no estoy familiarizado con ninguna función incorporada que pueda hacer el trabajo.
Respuestas
El primer enfoque que me viene a la mente es trazar los datos en una tabla. Esto eliminará las líneas vacías. Quizás haya mejores formas.
Código:
### remove empty lines in data
reset session
$Data <<EOD # Time (s) x (m) 0.0 0.0 1.0 1.0 2.0 2.0 3.0 3.0 4.0 4.0 5.0 5.0 5.0 10.0 6.0 11.0 7.0 12.0 8.0 13.0 9.0 14.0 10.0 15.0 EOD set table $Data2
plot $Data u 1:2 w table unset table plot $Data2 u 1:2 w l
### end of code
Además: en realidad, hay otro enfoque en una sola línea de código (aunque tampoco demasiado obvio) que no duplica los datos en la memoria (tal vez solo sea relevante para datos grandes). Podrías usar undefine $Datalo que supongo que liberará la memoria de $Data.
El siguiente código de una sola línea dará el mismo resultado que el procedimiento de tabla anterior. Los datos se dibujan como vectores de un punto de datos al siguiente y, por lo tanto, también se ignoran las líneas vacías.
plot x1=y1=NaN $Data u (x0=x1):(y0=y1):(x1=$1,x1-x0):(y1=$2,y1-y0) w vec nohead notitle
Resultado: