web-dev-qa-db-ja.com

gnuplot:範囲内の最大値と最小値

異なるX範囲のデータをプロットしていますが、現在のX範囲のデータの最大値と最小値に応じてyrangeを変更したいと思います。 GPVAL_Y_MAXおよびGPVAL_Y_MINを使用すると、これらの値は範囲内のデータだけでなく、データ全体の最大値と最小値に対応します。

たとえば、次のデータがあります。

1 3
2 5
3 8
4 20
5 30

次のスクリプトを使用します。

plot 'data.txt' u 1:2;
set xrange [1:3];
replot
set xrange [1:5];
replot

最初のプロットではyrangeを[3:8]に設定しますが、2番目のプロットではyrangeを[3:30]に設定します。私のようなものを使用する場合

set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX]

GPVAL_Y_MINとGPVAL_Y_MAXは、xrangeに関係なく同じ値を持ちます。

解決策はありますか?

17
josematamoros

必要な変数はGPVAL_DATA_Y_MINおよびGPVAL_DATA_Y_MAXです。これらは、特定の範囲にプロットされたデータのy-min/maxです。 GPVAL_Y_MINGPVAL_Y_MAXは、プロット境界線の端がどこにあるかを示すため、一般的に少し有用性が低くなります(一般に、これらの値は、gnuplotがデータとプロットのEdgeの間に少しスペースを残すため、GPVAL_DATA...変数を少し超えます)。

これらの変数を利用するには、plotコマンドに範囲指定子を使用する必要があります。

plot [1:3] 'data.txt'
set yr [GPVAL_DATA_Y_MIN:GPVAL_DATA_Y_MAX]
replot
...

ちなみに、最初の2列をxとyとしてプロットすることがgnuplotのデフォルトであるため、プロットする列を思い出したくない限り、u 1:2の指定は冗長です。同じ出力ターミナルに再プロットしたくない場合(再プロットが同じプロットで2ページ目を作成するepsのような一部のターミナルでは役に立たない)、次のコマンドシーケンスを使用します。

set terminal unknown
plot [1:3] 'data.txt'
set terminal <actual output terminal here>
set output 'output.trm'
plot [1:3][GPVAL_DATA_Y_MIN:GPVAL_DATA_Y_MAX] 'data.txt'

範囲指定子の使用に注意してください。今回はy範囲が指定されています。これはset yrangeで指定するよりも少しコンパクトですが、コードの行が長くなります。

Gnuplot 4.6.0以降を使用している場合、statsコマンドを利用して再プロットを回避できます。 statsコマンドは、便利な変数の束を作成します

stats [1:3] 'data.txt'
plot [1:3][stats_min_y:stats_max_y] 'data.txt'

少し異なるコマンド、

stats [1:3] 'data.txt'
plot [stats_min_x:stats_max_x][stats_min_y:stats_max_y] 'data.txt'

実際のデータがある場所に基づいて、x方向にプロットを塗りつぶします。たとえば、{(1.1、3)、(2、4)、(2.9,5)}にデータポイントがある場合、x範囲は[1.1:2.9]に設定されます。

15
andyras

YrangeをGPVAL_DATA_Y_MIN:GPVAL_DATA_Y_MAXに設定すると、gnuplotsの自動スケーリング機能を使用しないため、範囲が次のティックに拡張されるという欠点があります。

したがって、自動プロットでは、以下を好む

f(x)=sin(x)>0.5? 1:-1 #example function

set ytics 0.2
plot  1.01*f(x) # dummy plot to set GPVAL_*
set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX]

plot f(x) # actual plot

もちろん、これはデータプロットでも機能します。

plot 'data.csv' u 1:(1.01*$2)
set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX]
plot 'data.csv' u 1:2
4
Malte