17

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

このファイルは、時間の経過に伴うロケットモーターの推力を表しています。データはニュートン単位です。左側にニュートン(これは当然のことながらそれ自体で発生します)を表示し、右側にポンド力を表示したいと思います。変換は単純な係数です(lbfを取得するにはNに0.2248を掛けます)。

y2ticsを設定できますが、y2rangeを手動で設定すると、右側に表示されます。方法がわからないのは、y2rangeを自動的にy1range*係数に設定することです。

私の最終的な解決策は、2回プロットすることです。1回はy1にニュートンで、もう1回はy2にポンドで、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 (下のサンプルグラフ) ここに画像の説明を入力してください

4

3 に答える 3

21

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

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
于 2012-12-20T13:21:19.673 に答える
17

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

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

<code> set link</code>の例

于 2014-11-04T14:15:31.610 に答える
5

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

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使用できます)。することを忘れないでくださいstatsGPVAL_DATA_Y_MAX

set ytics nomirror

これにより、(ほぼ)1つのライナーで、探しているものが正確に得られます。 ここに画像の説明を入力してください

グリッドを使用し、変換された係数をにx2axis設定して、たとえばラベルy =50Nがy2=11.2に対応するようにする場合(グリッドを使用すると、物事が整頓されます)、次のことができます。

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

結果は次のとおりです。 ここに画像の説明を入力してください

于 2014-11-04T12:28:31.260 に答える