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)
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
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
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:
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: