Memperbaiki jarak antara kutu pada sumbu di gnuplot


Sementara menyiapkan beberapa hasil untuk dipublikasikan di jurnal, muncul pertanyaan: bagaimana cara mendistribusikan data secara merata di sepanjang poros di gnuplot . Saya memutuskan pertanyaannya, saya dapat grafiknya. Siapa yang peduli bagaimana, tolong, di bawah kucing.

Awalnya, selama alur kerja, semua grafik dibangun di MS Excel. Cukup nyaman di dalamnya untuk membuat sketsa data dengan cepat, membangun beberapa kurva dan melanjutkan. Tetapi bekerja di MS Excel, tidak ada kontrol atas gambar yang dihasilkan. Karena itu, ketika menulis hasil untuk artikel, saya sering menggunakan gnuplot.

Diperlukan untuk menerima grafik seperti itu:



Pada set data ini

data.csv
7.3;	0.0251;	250;	217.9006251
5.3;	0.0348;	293;	238.6280188
3.3;	0.0398;	176;	177.7890558
7.4;	0.0413;	262;	229.6579533
3.2;	0.0438;	186;	180.6920998
7.2;	0.0468;	265;	233.6496388
5.1;	0.0486;	247;	248.6435206
5.2;	0.0685;	239;	263.0861645
3.4;	0.0697;	180;	199.4893097
3.1;	0.0717;	167;	200.9408317
4.3;	0.0718;	405;	358.2750638
2.2;	0.0728;	267;	255.5794728
1.1;	0.0797;	226;	314.1587397
1.3;	0.0797;	225;	314.1587397
1.2;	0.0822;	292;	315.9731422
2.4;	0.0852;	276;	264.5789092
1.4;	0.0879;	299;	320.1099799
6.4;	0.098;	362;	311.209506 
2.3;	0.102;	331;	276.771694 
2.1;	0.1021;	233;	276.8442701
6.1;	0.1182;	372;	325.8698782
4.1;	0.1263;	335;	397.8290383
4.4;	0.1436;	459;	410.3847036
4.2;	0.1455;	435;	411.7636495
6.2;	0.153;	360;	351.126361


Jika Anda menjalankan ini melalui gnuplot, Anda mendapatkan yang berikut: titik-titik bergabung.



Tapi ini sepertinya tidak seperti yang saya inginkan.

Dokumentasi resmi membantu memahami nama label yang tepat pada sumbu ( xtic ) dan label di area grafik ( sprintf ):

set xtics rotate by -60
Label(String,Size) = sprintf("{/=%d %s}", Size, String)

plot "data.csv" using 2:3:xtic(2) title "1" w lp ls 1 ,\
     "data.csv" using 2:4 title "2" w lp ls 2 ,\
     "data.csv" using 2:($3>$4?$3+20:$4+20):(Label(stringcolumn(2), 12)) with labels notitle

Mengiris

($3>$4?$3+20:$4+20)

memungkinkan Anda untuk menetapkan tanda pada gambar di atas poin yang dipilih sebanyak 20 unit.

Ternyata begini:



Tapi pertanyaan dengan distribusi data yang tidak merata di sepanjang sumbu tetap terbuka.
Keputusan itu dibentuk dalam proses berkeliaran di sekitar forum dan artikel - nomor baris .

Opsi termudah adalah dengan memberi nomor secara manual.

Opsi kedua adalah angka secara otomatis:

 nl -v 0 -s ';' -w 1 data.csv >> data_nums.csv 

Jika Anda perlu mengecualikan komentar keluar, perintah mengambil bentuk:

grep -v "^#" data.csv | nl -v 0 -s ';' -w 1  >> data_nums.csv 

data_nums.csv
0;	7.3;	0.0251;	250;	217.9006251
1;	5.3;	0.0348;	293;	238.6280188
2;	3.3;	0.0398;	176;	177.7890558
3;	7.4;	0.0413;	262;	229.6579533
4;	3.2;	0.0438;	186;	180.6920998
5;	7.2;	0.0468;	265;	233.6496388
6;	5.1;	0.0486;	247;	248.6435206
7;	5.2;	0.0685;	239;	263.0861645
8;	3.4;	0.0697;	180;	199.4893097
9;	3.1;	0.0717;	167;	200.9408317
10;	4.3;	0.0718;	405;	358.2750638
11;	2.2;	0.0728;	267;	255.5794728
12;	1.1;	0.0797;	226;	314.1587397
13;	1.3;	0.0797;	225;	314.1587397
14;	1.2;	0.0822;	292;	315.9731422
15;	2.4;	0.0852;	276;	264.5789092
16;	1.4;	0.0879;	299;	320.1099799
17;	6.4;	0.098;	362;	311.209506 
18;	2.3;	0.102;	331;	276.771694 
19;	2.1;	0.1021;	233;	276.8442701
20;	6.1;	0.1182;	372;	325.8698782
21;	4.1;	0.1263;	335;	397.8290383
22;	4.4;	0.1436;	459;	410.3847036
23;	4.2;	0.1455;	435;	411.7636495
24;	6.2;	0.153;	360;	351.126361


Saat bekerja dengan set data seperti itu, gnuplot akan mendistribusikan data sepanjang sumbu secara berkala:



Skrip ringkasan:

#!/usr/bin/gnuplot -persist

set encoding utf8
set terminal pngcairo size 640,400 enhanced monochrome
set output "img.png"

set ylabel "Y"
set xlabel "X"
set key left top samplen 5 spacing 1.15 width 2
set xrange [-0.5:24.5]
set mytics 2
set xtics rotate by -60
set grid
set pointsize 0.5
set datafile separator ";"
set style line 1 linetype 1 pointtype 7 linewidth 2 linecolor black
set style line 2 linetype 2 pointtype 7 linewidth 2 linecolor black

Label(String,Size) = sprintf("{/=%d %s}", Size, String)

plot "data_nums.csv" using 1:4:xtic(3) title "1" w lp ls 1 ,\
     "data_nums.csv" using 1:5 title "2" w lp ls 2 ,\
     "data_nums.csv" using 1:($4>$5?$4+20:$5+20):(Label(stringcolumn(2), 10)) with labels notitle


pembaruan:
Terima kasih atas perhatianDeosisdan referensi yang akurat untuk dokumentasi (paragraf Pseudocolumns ) ternyata bisa Anda lakukan tanpa penomoran buatan.
Untuk distribusi data yang seragam di sepanjang sumbu, Anda dapat menggunakan kolom nol ($ 0), yang menyediakan indeks baris.

Dalam hal ini, dimungkinkan untuk menggunakan kumpulan data asli - data.csv, dan membuat perubahan berikut pada skrip:
plot "data.csv" using 0:3:xtic(2) title "1" w lp ls 1 ,\
     "data.csv" using 0:4 title "2" w lp ls 2 ,\
     "data.csv" using 0:($3>$4?$3+20:$4+20):(Label(stringcolumn(2), 12)) with labels notitle

Source: https://habr.com/ru/post/undefined/


All Articles