web-dev-qa-db-fra.com

Gnuplot: comment ajouter l'échelle de l'axe y2 pour différentes unités

Je trace des données à partir d'un fichier. Les points de données sont en unités métriques. Je veux montrer une deuxième échelle à droite (y2) qui est en unités standard.

Le fichier représente la poussée du moteur-fusée dans le temps. Les données sont en Newtons. Je veux montrer les newtons sur la gauche (cela se produit naturellement, naturellement) et la force des livres sur la droite. La conversion est un facteur simple (multipliez N par 0,2248 pour obtenir lbf).

Je peux définir y2tics et si je règle manuellement y2range, ils apparaissent à droite. Ce que je ne sais pas faire, c'est définir automatiquement y2range sur y1range * un facteur.

Ma solution éventuelle consiste à tracer deux fois, une fois en Newtons sur y1 et une fois en livres sur y2, et rendre le tracé y2 presque invisible:

plot '-' using 1:($2*0.2248) with dots axes x1y2 lc rgb 'white' notitle, \
      '' using 1:2 with lines lc rgb '<color>' title '<title>'

La solution ci-dessus génère souvent des échelles y légèrement différentes: avec l'autoragne, gnuplot arrondit la plage de sorte que la coche supérieure sur chaque axe est un nombre arrondi, et bien sûr l'arrondi est différent pour différentes unités.

En fin de compte, je me retrouve avec Python qui trouve la valeur de poussée la plus élevée dans chaque graphique, puis je définis explicitement yrange sur ce nombre et y2range sur ce nombre * 0,2248:

f.write("set yrange [0:%s]; set y2range[0:%s]\n" % (peak_thrust, peak_thrust*NEWTON_LBF));

Voici le résultat final: http://www.lib.aero/hosted/motors/cesaroni_12-15-12.html (exemple de graphique ci-dessous) enter image description here

12
iter

Il me semble que la façon la plus simple de procéder consiste à simplement mettre à l'échelle les données:

set y2tics
plot sin(x) w lines, 5*sin(x) w lines axes x1y2

Bien sûr, vous tracez des données à partir d'un fichier, cela ressemblerait donc à quelque chose de plus:

set y2tics
FACTOR=0.2248  #conversion factor from newtons to lbf
plot 'datafile' u 1:2 w lines, '' u 1:(FACTOR*$2) w lines

Si vous définissez explicitement le yrange (ce que vous devrez peut-être faire):

set yrange [ymin:ymax]
set y2range [ymin*FACTOR:ymax*FACTOR]

Enfin, si vous voulez vraiment compter sur l'autoscaling, vous devrez faire de la "gymnastique".

Tout d'abord, définissez un terminal factice afin que nous puissions plot sans faire de tracé:

set term unknown
plot 'datafile' u 1:2  #collect information on our data

Maintenant que nous avons collecté des informations sur les données, nous pouvons définir notre véritable y2range

FACTOR=0.2248
set y2range [FACTOR*GPVAL_Y_MIN : FACTOR*GPVAL_Y_MAX]
set y2tics nomirror
set ytics nomirror

Maintenant, définissez le terminal et tracez les données:

set term ...
set output ...
plot 'datafile' u 1:2 w lines
16
mgilson

La version 5.0 a ajouté la prise en charge de ce type de relations entre les y et y2 (ou aussi x et x2) axe:

set xrange[0:370]
set ytics nomirror
set y2tics
set link y2 via 0.2248*y inverse y/0.2248
plot x

example for <code>set link</code>

12
Christoph

Je sais que c'est une vieille question et la réponse a déjà été acceptée, mais je pense que cela vaut la peine de partager mon approche.

J'utilise simplement des étiquettes modifiées pour le x2axis. Dans votre cas, ce serait

set y2tics ("10" 10/0.2248, "20" 20/0.2248 etc etc...

qui peut être bouclé de cette façon

do for [i=0:1000:10] { set y2tics add (sprintf("%i",i) i/0.2248) }

où la plage for doit être ajustée en fonction de vos données (vous pouvez utiliser stats et la variable GPVAL_DATA_Y_MAX pour une totale tranquillité d'esprit). N'oubliez pas

set ytics nomirror

Cela vous donnera exactement ce que vous recherchez, dans (presque) une doublure: enter image description here

Si vous souhaitez utiliser une grille et avoir les facteurs convertis sur le x2axis, de sorte que par exemple à l'étiquette y = 50 N correspondrait y2 = 11,2 (cela garde les choses en ordre si vous utilisez une grille) vous pouvez faire

do for [i=0:1000:50] { set y2tics add (sprintf("%5.1f",i*0.2248) }

Voici le résultat: enter image description here

2