Est-il possible d'utiliser deux axes y positifs avec gnuplot? Ceci est juste un exemple simple pour la question.

plot.gp:

reset
set style fill solid 1
set boxwidth 0.8 relative
plot 'data1.dat' index 1 using 1:2     with boxes title 'A' ,\
              '' index 2 using 1:(-$2) with boxes title 'B'

Au lieu d'utiliser 1:(-$2), j'aimerais utiliser 1:2 dans la dernière ligne de plot.gp.

data1.dat:

0.12   0.024
0.15   0.132
0.18   0.241
0.22   0.136


0.12   0.039
0.15   0.219
0.18   0.197
0.22   0.155

De:

enter image description here

À:

enter image description here

1
pDashman 13 mars 2021 à 07:51

2 réponses

Meilleure réponse

Même réponse que celle de theoz sauf que les étiquettes y2 sont décalées vers la gauche du tracé et la commande set link y2 est utilisée pour généraliser l'inversion des axes.

Vous pouvez ajuster le décalage graph -1.03 pour superposer les étiquettes "0", puis supprimer l'étiquette "0" en double en changeant la plage de tic y2 en set y2tics 0.1,0.1.

$Data <<EOD
0.12   0.024
0.15   0.132
0.18   0.241
0.22   0.136


0.12   0.039
0.15   0.219
0.18   0.197
0.22   0.155
EOD

set style fill transparent solid 0.5
set boxwidth 0.8 relative
set xzeroaxis ls -1

set yrange[-0.3:0.3]
set ytics 0,0.1
set mytics 2

# Set y2 axis to exact mirror of y1
# Shift tic labels to the left and use right-justified text
set link y2 via -y inv -y
set y2tics 0,0.1
set y2tics offset graph -1.03 right

plot $Data u 1:2 index 0 axis x1y1 w boxes title 'A' ,\
        '' u 1:2 index 1 axis x1y2 w boxes title 'B'

enter image description here

1
Ethan 13 mars 2021 à 17:42

Voici une solution avec un seul tracé, cependant, les tics de l'axe y sont de différents côtés. Il existe peut-être un moyen facile de les mettre du même côté.

Code:

### two "positive" y-axes
reset session

$Data <<EOD
0.12   0.024
0.15   0.132
0.18   0.241
0.22   0.136


0.12   0.039
0.15   0.219
0.18   0.197
0.22   0.155
EOD

set style fill transparent solid 0.5
set boxwidth 0.8 relative

set yrange[-0.3:0.3]
set ytics 0,0.1
set mytics 2
set y2range[0.3:-0.3]
set y2tics 0,0.1
set my2tics 2
set y2tics mirror
set xzeroaxis ls -1

plot $Data u 1:2 index 0 axis x1y1 w boxes title 'A' ,\
        '' u 1:2 index 1 axis x1y2 w boxes title 'B'
### end of code

Résultat:

enter image description here

Ajout:

Voici une deuxième suggestion avec toutes les étiquettes ytic d'un côté. Un petit inconvénient est qu'il ne s'agit pas de mise à l'échelle automatique et que vous devez définir la plage et les étapes "manuellement". Il utilise la commande evaluate (check help evaluate). Et real() (check help real) afin d'éviter la division entière de gnuplot au cas où les deux nombres de la division pourraient être des entiers.

Code:

### y-axis with two "positive" directions
reset session

$Data <<EOD
0.12   0.024
0.15   0.132
0.18   0.241
0.22   0.136


0.12   0.039
0.15   0.219
0.18   0.197
0.22   0.155
EOD

set style fill transparent solid 0.5
set boxwidth 0.8 relative
set xzeroaxis ls -1

Max = 0.3
Steps = 3
set yrange[-Max:Max]
set ytics ()            # remove all tics
do for [i=-Steps:Steps] {
    myTic = sprintf('set ytics add ("%g" %g)',abs(real(i)/Steps*Max),real(i)/Steps*Max)
    eval(myTic)
}

plot $Data u 1:2     index 0 axis x1y1 w boxes lc 3 title 'A' ,\
        '' u 1:(-$2) index 1 axis x1y1 w boxes lc 4 title 'B'
### end of code

Résultat:

enter image description here

0
theozh 13 mars 2021 à 19:21