1

gnuplot に組み込まれている関数へのすべてのパイプを検索した後でも、データファイルの n 番目の要素 (インクリメントや単一の値ではなく) にアクセスして、関数内の定数 (または関数内のパラメーター) として使用する簡単な方法をまだ見つけていません。 for ループ) 私のプロット用。たとえば、2 つの列を持つ単調減少データファイルがあり、プロット中に y 値を正規化したいので、各データポイントから最後の値を減算し、減算を差で割ることによって y の範囲を 1 から 0 にします。最初のデータポイントと最後のデータポイントの間。awk を試しましたが、構文にあまり慣れていません。簡単な方法があれば知りたいです。

例えば

1:(($2-'lastdatapoint')/('firstdatapoint'-'lastdatapoint')) を使用して "my2columndata.dat" をプロットします。

または、最初と最後のデータポイントが同名であるようなもの-それらは単調減少データファイル「my2columndata.dat」の最初と最後のデータポイントです

4

3 に答える 3

2

アイデアは @andyras のものと同じですが、stats.

タイトルに答えるには、 を使用できますevery ::n::n。ここで、n は選択したレコード (データポイント) 番号です。レコードは 0 から数えられるので、最初の行が必要な場合はevery ::0::0. 、、または( inの使用法は文書化されていません) のいずれかでevery使用できます。何もプロットしないので、私は好みますが、gnuplot コンソールを乱雑にします (コマンドの最後で乱雑なコンソールを使用しないようにEDITします)。また、任意の割り当てを行うために使用できます。plotsplotstatseverystatsstatsnooutputstatsusing

たとえば、最初のレコードの 2 列目を保存するには、

stats "my2columndata.dat" u (firstdatapoint=$2) every ::0::0

最後のレコードを取得するには、 によって保存されたレコードのstats数を使用し、それを のレコード番号として使用できますevery

stats "my2columndata.dat" # this saves the number of records to STATS_records
stats "my2columndata.dat" u (lastdatapoint=$2) every ::STATS_records-1::STATS_records-1

これで、要求したプロットを実行できます。


そして、私が終える前に、いくつかの追加のハック:

列を数える mgilson のアイデアを使用すると、すべての列を多数の変数に保存することもできます。(注: 、およびの省略形uを使用しています)usingevevery

filename = "yourfilename.dat"
r = 0 # record number
good = 1
col = 1
while (good) {
 stats filename u (good=valid(col)) ev ::r::r
 if (good) {
  stats filename u col ev ::r::r
  eval(sprintf("v%d=STATS_max",col))
  col = col+1
 }
}

データファイルに 8 つの列が含まれている場合、v1tov8が定義されます。

しかし、外部ツールを使用するのが正しい方法だと思います(UNIXライクは、テール/ヘッドなどを使用できます)。これを可能にしたのは gnuplot の作者のせいにしましょう :)

于 2013-07-02T02:38:02.160 に答える
1

あなたの場合(データファイルが単調に減少していることを知っているので)、これを行うのはそれほど難しくありません。

set terminal unknown
plot 'my2columndata.dat' # gather basic statistics
first=GPVAL_DATA_Y_MAX
last=GPVAL_DATA_Y_MIN

set terminal <whatever>
set output <whatever.wht>
plot 'my2columndata.dat' u 1:(($2-last)/(first-last))

このメソッドは、出力を作成せずにデータファイルに関する情報を収集し、GPVAL 変数を使用して再プロットします。(コマンド でプロットした後、gnuplot でこれを見ることができますshow variables all。) gnuplot 4.6.0 以降では、statsコマンドを使用して、ここで行ったようにプロットせずにデータを収集できます。statsただし、異なる変数名を作成します。

(質問のタイトルが示唆しているように)n番目のデータポイントにアクセスするのは難しいでしょう。

于 2012-12-21T16:22:05.253 に答える
0

質問はかなり古いですが、場合によっては、特定の列の最初、n 番目、または最後の値を取得する必要がある場合があります。Linux ユーザーが awk や他の外部プログラムを使用する可能性があることは知っていますが、以下はプラットフォームに依存しないgnuplot のみのソリューションです。

@andyras および @syockit からの既存の回答に対するこのソリューションの違い:

  • 非単調減少データにも機能します
  • 必要ありませんstats
  • 複数の空の行を持つデータでも動作します (@syockit のソリューションは間違った結果をもたらす可能性があります)。
  • n番目のデータ ポイントも返します。

gnuplot 4.6.0 でも動作します (OP 質問時)。

データ: ( "Data.dat")

# some comments
 0.1  0.2
 1.1  1.2
 2.1  2.2

 4.1  4.2
 5.1  5.2

 7.1  7.2


10.1 10.2
11.1 11.2

13.1 13.2
14.1 14.2


17.1 17.2

19.1 19.2
20.1 20.2

22.1 22.2

24.1 24.2
25.1 25.2

コード:

### get fist, nth and last datapoint of a column
reset

PointFirst = NaN
PointNth = NaN
PointLast = NaN
N=8

set terminal unknown
n=0
plot "Data.dat" u (n=n+1, n==1?PointFirst=$2:NaN, N==n?PointNth=$2:PointLast=$2)

print sprintf("First point:  %g",PointFirst)
print sprintf("% 2dth point:  %g",N,PointNth)
print sprintf("Last point:  %g",PointLast)
### end of code

結果:

First point:  0.2
 8th point:  11.2
Last point:  25.2
于 2020-03-10T14:29:13.850 に答える