Gnuplot: bagaimana cara memplot dengan garis kontinu di beberapa blok data?
Saya memiliki file dat yang dibagi menjadi beberapa blok, misalnya sebagai berikut:
# 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
Script minimal berikut ini:
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
menghasilkan gambar ini:
Gnuplot memplot dua baris, satu untuk setiap blok. Namun, karena data x tidak bersambung antara dua blok, lompatan muncul di plot.
Saya ingin menggabungkan dua baris ini di plot keluaran, tanpa mengubah file data. Apakah ada cara untuk melakukan ini?
Mungkin itu bisa dilakukan dengan membaca baris terakhir dari setiap blok dan yang pertama dari blok berikutnya dan memplot garis antara dua titik seperti itu, tapi saya tidak terbiasa dengan fungsi bawaan yang bisa melakukan pekerjaan itu.
Jawaban
Pendekatan pertama yang terlintas di benak saya adalah memplot data ke dalam tabel. Ini akan menghapus baris kosong. Mungkin ada cara yang lebih baik.
Kode:
### 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
Penambahan: Sebenarnya ada pendekatan lain dalam satu baris kode (walaupun tidak terlalu jelas juga) yang tidak menduplikasi data di memori (mungkin hanya relevan untuk data besar). Anda bisa menggunakan undefine $Datayang saya kira akan membebaskan memori $Data.
Kode baris tunggal berikut akan memberikan hasil yang sama seperti prosedur tabel di atas. Data digambar sebagai vektor dari satu titik data ke titik berikutnya dan karenanya mengabaikan baris kosong juga.
plot x1=y1=NaN $Data u (x0=x1):(y0=y1):(x1=$1,x1-x0):(y1=$2,y1-y0) w vec nohead notitle
Hasil: