Distancia fija entre ticks en un eje en gnuplot


Mientras preparaba algunos resultados para su publicaci贸n en la revista, surgi贸 la pregunta: c贸mo distribuir uniformemente los datos a lo largo del eje en gnuplot . Decid铆 la pregunta, obtuve los gr谩ficos. A qui茅n le importa c贸mo, por favor, debajo del gato.

Inicialmente, durante el flujo de trabajo, todos los gr谩ficos se crearon en MS Excel. Es bastante conveniente en 茅l dibujar r谩pidamente datos, construir un par de curvas y seguir adelante. Pero trabajando en MS Excel, no hay control sobre el dibujo resultante. Por lo tanto, cuando escribo resultados para art铆culos, a menudo uso gnuplot.

Es necesario recibir dicho gr谩fico:



por este conjunto de datos

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 ejecuta esto a trav茅s de gnuplot, obtendr谩 lo siguiente: los puntos se fusionan.



Pero esto no se parece mucho a lo que quer铆a obtener.

La documentaci贸n oficial ayud贸 a comprender los nombres correctos de las etiquetas en el eje ( xtic ) y las etiquetas en el 谩rea del gr谩fico ( 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

Rebanada

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

le permite establecer marcas en la figura sobre los puntos seleccionados en 20 unidades.

Result贸 de esta manera:



Pero la pregunta con la distribuci贸n desigual de datos a lo largo del eje permaneci贸 abierta.
La decisi贸n se form贸 en el proceso de deambular por foros y art铆culos: numere las l铆neas .

La opci贸n m谩s f谩cil es numerar manualmente.

La segunda opci贸n es numerar autom谩ticamente:

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

Si necesita excluir l铆neas comentadas, el comando toma la forma:

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


Al trabajar con dicho conjunto de datos, gnuplot distribuir谩 los datos a lo largo del eje a intervalos regulares:



Script de resumen:

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


actualizaci贸n:
gracias a la atenci贸n plenaDeosisy una referencia precisa a la documentaci贸n (p谩rrafo Pseudocolumnas ) result贸 que se puede hacer sin numeraci贸n artificial.
Para una distribuci贸n uniforme de datos a lo largo del eje, puede usar la columna nula ($ 0), que proporciona 铆ndices de fila.

En este caso, es posible usar el conjunto de datos original - data.csv, y realizar los siguientes cambios en el 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