web-dev-qa-db-ja.com

gnuplot:異なる単位にy2軸スケールを追加する方法

ファイルからデータをプロットしています。データポイントはメートル単位です。右側に2番目の目盛り(y2)を標準単位で表示します。

このファイルは、ロケットモーターの推力の経時変化を表しています。データはニュートン単位です。左側にニュートンを表示し(これは自然に発生します)、右側にポンドの力を表示します。変換は単純な要素です(Nに0.2248を掛けてlbfを取得)。

Y2ticsを設定できます。手動でy2rangeを設定すると、右側に表示されます。どうすればよいかわからないのは、y2rangeを自動的にy1range *係数に設定することです。

私の最終的な解決策は、1回はy1のニュートンで、もう1回はy2のポンドで2回プロットし、y2プロットをほとんど見えないようにすることです。

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

上記の解決策はしばしばわずかに異なるyスケールを生成します:autoragneを使用すると、gnuplotは範囲を切り上げて、各軸の上の目盛りが丸められます。もちろん、丸めは異なる単位で異なります。

最終的に私は各グラフで最高推力値を見つけるPythonコードで終了します。次に、yrangeをその数に明示的に設定し、y2rangeをその数に設定します* 0.2248:

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

これが最終結果です: http://www.lib.aero/hosted/motors/cesaroni_12-15-12.html (以下のサンプルグラフ) enter image description here

12
iter

これを行う最も簡単な方法は、単にデータをスケーリングすることだと私には思われます。

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

もちろん、ファイルからデータをプロットしているので、次のようになります。

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

Yrangeを明示的に設定している場合(必要な場合があります):

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

最後に、本当に自動スケーリングに依存したい場合は、「体操」を行う必要があります。

まず、プロットを作成せずにplotできるようにダミー端子を設定します。

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

データに関する情報を収集したので、実際のy2range

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

次に、ターミナルを設定してデータをプロットします。

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

バージョン5.0では、yy2(またはxx2)軸の間のこの種の関係のサポートが追加されました。

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

私はそれが古い質問であり、答えがすでに受け入れられていることを知っていますが、私のアプローチを共有する価値があると思います。

私は単にx2axisに変更されたラベルを使用します。あなたの場合、これは

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

このようにループできます

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

forの範囲は、データに応じて調整する必要があります(statsと変数GPVAL_DATA_Y_MAXを使用すると、完全に安心できます)。することを忘れないでください

set ytics nomirror

これはあなたが探しているものを正確に与えます、(ほとんど)1つのライナーで: enter image description here

グリッドを使用し、変換された係数をx2axisに設定したい場合、たとえば、ラベルy = 50 Nがy2 = 11.2に対応するようにします(グリッドを使用すると、整頓された状態を保ちます)。

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

これが結果です: enter image description here

2