2

みんな。

定期的に更新されるデータがあります。例えば:

1330347541 79 100 6 163 38
1330349341 80 103 6 165 38
1330351141 80 104 6 166 40
1330352941 80 104 6 166 40
1330354741 81 104 8 167 41

そのデータをgnuplotでグラフに描きたい。

1 か月前から現在までのデータを取得するにはどうすればよいですか? どの xrange を選択する必要がありますか?

編集:「set xrange [now - 2592000, now]」のようなものが必要です

4

3 に答える 3

2

同様の問題がありました。プロットをどのように行っているかを正確に示していませんでしたが。タイムスタンプを使用して範囲を設定したかったのですが、予期しないものが見つかりました。. . 古いですが、この質問に答える価値があると思います。

2 つの便利な機能:

  1. xrange を [*.*] に設定してプロットし、「xrange を表示」して、gnuplot が使用している xrange の内部表現を調べることができます。

  2. gnuplot で () を使用して、計算と関数呼び出しを挿入できます。

回答 #1 timecolumn を使用してプロットしていますか? gnuplot 4.7 より前の gnuplot の内部時間は、UNIX エポック 1970 年 1 月 1 日ではなく、2000 年 1 月 1 日を基準にして追跡されていました。答えは、使用している gnuplot のバージョンによって異なります。gnuplot で () を使用して、関数の呼び出しや計算を行うことができます。シェル コマンド date を呼び出して、タイムスタンプを取得できます。そう 。. .

set xrange [(system("date -d 'now' +%s")-2592000):(system("date -d 'now' +%s"))]
show xrange
    set xdata time
    set xrange [ "1431007547" : "1431008547" ] noreverse nowriteback

gnuplot 4.7 より前では、すべてのタイムスタンプから 946684800 秒を引く必要があります。実際、約 1893370441 秒 =~ 60 年が、私のバージョンの gnuplot (4.6) で差し引かなければならない値であることがわかりました。xrange を設定せずにタイムスタンプ データをプロットしてタイムスタンプ オフセットを見つけてから、「xrange を表示」を実行してオフセットを計算します。

したがって、使用するオフセットを定義し、次のように xrange を設定します。

####################################################################
## 1893456000 = 60 years seems to be the offset gnuoplot is using.##
## or is it 1893370441 ? yeah it seems to be a bit short of 60 years.
## I believe 946684800 should be the offset prior to 4.7.         ##
####################################################################
TIMEOFFSET=946684800
TIMEOFFSET=1893370441
set xrange [(system("date -d 'now' +%s")-2592000-TIMEOFFSET):(system("date -d 'now' +%s")-TIMEOFFSET)]

回答 #2 xrange は実際にデータ ファイルの行にありますか? (つまり、timecolumn を使用しない)。その場合、データ行に関して xrange を設定します。データが定期的である場合、何行戻るか = 特定の期間を計算できます。

私はたまたまこのバージョンの gnuplot を使用しています:

    Version 4.6 patchlevel 1    last modified 2012-09-26 

詳細と調査 ...

データの基本的なプロットを行います。

set xdata time
set timefmt "%s"
set timefmt x "%s"
set format x "%H:%M"
plot "lollo.data" using 1:2, "lollo.data" using 1:3

さて、データの最初のタイムスタンプから最後のタイムスタンプまでの単純な xrange を設定します。

set xrange [1330347541:1330351141]
plot "lollo.data" using 1:2, "lollo.data" using 1:3
                                               ^
     all points y value undefined!

うわぁ!? 本当に?それの何が問題なのですか?'show xrange' を実行して、gnuplot が認識している範囲を確認してみましょう。

show xrange
    set xdata time
    set xrange [ "1330347541" : "1330351141" ] noreverse nowriteback

それは問題ないようです。xrange を *:* に設定しましょう (gnuplot の開始点 (「set xrange restore」を実行することもできますが、[-10:10] に設定することはできません))。プロットを実行してから、xrange を表示します。 .

set xrange [*:*]
plot "lollo.data" using :2, "lollo.data" using :3
show xrange
    set xdata time
    set xrange [ * : * ] noreverse nowriteback  # (currently ["0":"4"] )

うーん。0:4!! 面白い。xrange が間に合わないデータ行で動作しているようです。そう。これはあなたの問題ですか?xrange が行ではなくタイムスタンプで機能すると仮定しますか? これを知っていれば、xrange を行単位で設定できるかもしれません。==答え #2

今。timecolumn を使用してデータをプロットしましょう。

set xrange [*:*]
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3
show xrange
    set xdata time
    set xrange [ * : * ] noreverse nowriteback  # (currently ["-563022900":"-563014800"] )

おっと!-563022900!? 負のタイムスタンプ。面白い。では、このバージョンの gnuplot のタイムスタンプ整数計算の奇妙さ/機能は?

データの最初から最後のタイムスタンプまでの単純な xrange を設定して、timecolumn を使用してプロットしてみましょう。

set xrange [1330347541:1330351141]
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3
                                                                           ^
     all points y value undefined!

それは好きではありません。内部で負のタイムスタンプ番号を処理している場合は理解できます。

() を使用して計算を囲む負の範囲を 1 か月未満の秒に設定しましょう。

set xrange [(-563014800-2592000):-563014800]
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3

それはうまくいきます。私のため。gnuplot 4.6. しかし、-563014800 はどこから来たのでしょう!?

$ date -d @1330347541
Mon 27 Feb 12:59:01 GMT 2012
$ dc -e '1330347541 16o p'
4F4B7E15
### ??? I didn't find any hex relation - looking for evidence of integer calc overflow/sign calc errors

# What offset 
$ dc -e '0 1330347541 - 563022900 - p'
-1893370441
# taking a timestamp from today (7 march 2015) and doing a plot I saw gnuplot used xrange with -462448800 . . . 
$ dc -e '0 1431000097 - 462448800 - p'
-1893448897

ハッ!ほぼ同じです。-1893448897 =~ -1893370441 それはちょうど約 60 年です。それで。60 年のオフセットが使用されています。私のバージョンの gnuplot では。面白い。そしてYEESH。内部 gnuplot タイムスタンプに変換するには、約 1893456000 秒を差し引く必要があるようです。実際には 1893370441 が必要なものに近いようです。

インターネット上の他の場所では、gnuplot のエポックは 2000 年であると言われています。これは、946684800 のオフセットを使用する必要があることを意味します。しかし、それは今の私には当てはまらないようです。

YMMV。私は推測する。

そのオフセットを使用して、次のように 1 か月前から現在までの xrange を設定できます: == Answer #1

TIMEOFFSET=1893370441
set xrange [(system("date -d 'now' +%s")-2592000-TIMEOFFSET):(system("date -d 'now' +%s")-TIMEOFFSET)]

そして、gnuplotでこれがどのように/なぜそうなのですか?

From : http://gnuplot.10905.n7.nabble.com/30-year-time-offset-reading-nonuniform-matrix-s-input-td17231.html当時 unix を使っていなかったので、2000 年は 1970 年と同じように恣意的に見えました。

もともと、とにかくユーザーに表示されることを意図していませんでしたが、時間データの範囲の設定などで、文字列ではなく数値を使用できることが後で発見されました。

また、時間は実数で格納されているため、小さい数値で使用できる解像度が制限されるため、大きなオフセットを持ち歩くのは良くないことも念頭に置いていたと思います。しかし、それはおそらく実際には関係ないと思います。

デイブD」

于 2015-05-07T16:07:20.243 に答える
1

解決:

plot \
    "< awk -v date=`date +'%s'` '{ if ($1 > date - 2592000) print $0; }' datafile" using 1:2 …
于 2012-02-29T08:56:16.950 に答える