Distance fixe entre les tiques sur un axe dans gnuplot


Lors de la préparation de certains résultats pour publication dans la revue, la question s'est posée: comment répartir uniformément les données le long de l'axe dans gnuplot . J'ai décidé de la question, j'ai eu les graphismes. Peu importe comment, s'il vous plaît, sous le chat.

Initialement, pendant le flux de travail, tous les graphiques ont été créés dans MS Excel. Il est très pratique pour esquisser rapidement des données, créer quelques courbes et passer à autre chose. Mais en travaillant dans MS Excel, il n'y a aucun contrôle sur le dessin résultant. Par conséquent, lorsque j'écris des résultats pour des articles, j'utilise souvent gnuplot.

Il est nécessaire de recevoir un tel graphique:



Par cet ensemble de données

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


Si vous exécutez ceci via gnuplot, vous obtenez ce qui suit: les points fusionnent.



Mais cela ne ressemble pas beaucoup à ce que je voulais obtenir.

La documentation officielle a aidé à comprendre les noms propres des étiquettes sur l'axe ( xtic ) et des étiquettes dans la zone graphique ( 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

Tranche

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

vous permet de définir des repères sur la figure au-dessus des points sélectionnés de 20 unités.

Cela s'est avéré ainsi:



mais la question de la répartition inégale des données le long de l'axe est restée ouverte.
La décision a été prise dans le processus d'errance autour des forums et des articles - numéroter les lignes .

L'option la plus simple consiste à numéroter manuellement.

La deuxième option consiste à numéroter automatiquement:

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

Si vous devez exclure des lignes commentées, la commande prend la forme:

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


Lorsque vous travaillez avec un tel ensemble de données, gnuplot distribuera les données le long de l'axe à intervalles réguliers:



Script récapitulatif:

#!/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


mise à jour:
Merci à la pleine conscienceDéoseet une référence exacte à la documentation (paragraphe Pseudocolonnes ) il s'est avéré que vous pouvez vous passer de numérotation artificielle.
Pour une distribution uniforme des données le long de l'axe, vous pouvez utiliser la colonne nulle ($ 0), qui fournit des indices de ligne.

Dans ce cas, il est possible d'utiliser l'ensemble de données d'origine - data.csv et d'apporter les modifications suivantes dans le script:
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