Gnuplot: como plotar com uma linha contínua em vários blocos de dados?

Sep 28 2020

Eu tenho um arquivo dat que é dividido em vários blocos, por exemplo, como o seguinte:

#   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

O seguinte script 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

produz esta figura:

O Gnuplot plota duas linhas, uma para cada bloco. No entanto, como os dados x são descontínuos entre os dois blocos, um salto aparece no gráfico.

Eu gostaria de juntar essas duas linhas no gráfico de saída, sem modificar o arquivo de dados. Existe uma maneira de fazer isso?

Talvez isso possa ser feito lendo a última linha de cada bloco e a primeira do próximo bloco e traçando uma linha entre esses dois pontos, mas não estou familiarizado com nenhuma função incorporada que possa fazer o trabalho.

Respostas

1 theozh Sep 28 2020 at 22:58

A primeira abordagem que me vem à mente é plotar os dados em uma tabela. Isso removerá as linhas vazias. Talvez existam maneiras melhores.

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

Adição: na verdade, há outra abordagem em uma única linha de código (embora não muito óbvia também) que não duplica os dados na memória (talvez relevante apenas para dados grandes). Você poderia usar o undefine $Dataque eu acho que vai liberar a memória $Data.

O seguinte código de linha única fornecerá o mesmo resultado que o procedimento da tabela acima. Os dados são desenhados como vetores de um ponto de dados para o próximo e, portanto, ignorando também as linhas vazias.

plot x1=y1=NaN $Data u (x0=x1):(y0=y1):(x1=$1,x1-x0):(y1=$2,y1-y0) w vec nohead notitle

Resultado: