0

プロットするデータが大量にあり、gnuplot を使用しようとしています。データは、約 80000 要素の並べ替えられた配列です。単純に使うことで

plot "myData.txt" using 1:2 with linespoints linetype 1 pointtype 1

出力は得られますが、レンダリングに時間がかかり、ポイントが散らかっていて、時々隙間ができます。2 番目の問題に対処するために、棒グラフを作成することを考えました。各エントリは棒に対応します。ただし、これを達成する方法がわかりません。連続するバーの間にスペースを空けたいのですが、表示されるとは思いません。データをプロットするための提案は何ですか?

...................................

データ量が多いため、グループ化するのが最善だと思います。私のデータは次のように見えることに注意してください

1 11041.9
2 11041.9
3 9521.07
4 9521.07
5 9520.07
6 9519.07
7 9018.07
...

3 つのグループでデータをプロットしたいと思います。つまり、最初の垂直線は 1、2、3 のポイントの最小値として 9521.07 で開始し、11041 で終了する必要があります。2 番目の垂直線は次のことを考慮する必要があります。 3 ポイント: 4、5、6、9519.07 で始まり、9521.07 で終わる、など。

図のようなデータファイルが与えられた場合、これは gnuplot で達成できますか? もしそうなら、誰かが私が使用すべき一連のコマンドを投稿してくれれば幸いです。

4

2 に答える 2

2

everygnuplot が実際に描画するポイントの数を減らすには、次のキーワードを使用できます。

plot "myData.txt" using 1:2 with linespoints linetype 1 pointtype 1 every 100

100 番目のデータ ポイントごとにプロットします。

gnuplot 内であなたが望むこと (垂直線のプロット) をエレガントに行うことができるかどうかはわかりませんが、私の解決策は次のとおりです (UNIX-y 環境を想定しています)。まず、次の awk スクリプトを作成しますsort.awk

BEGIN { RS = "" }
{
 # the next two lines handle the case where
 # there are not three lines in a record
 xval = $1 + 1
 ymin = ymax = $2
 # find y minimum
 if ($2 <= $4 && $2 <= $6)
  ymin=$2
 else if ($4 <= $2 && $4 <= $6 && $4 != "")
  ymin=$4
 else if ($6 <= $2 && $6 <= $4 && $6 != "")
  ymin=$6
 # find y maximum
 if ($2 >= $4 && $2 >= $6)
  ymax=$2
 else if ($4 >= $2 && $4 >= $6)
  ymax=$4
 else if ($6 >= $2 && $6 >= $4)
  ymax=$6
 # print the formatted line
 print ($1+1) " " ymin " " ymin " " ymax " " ymax
}

これで、この gnuplot スクリプトがそれを呼び出します:

set terminal postscript enhanced color
set output 'plot.eps'

set boxwidth 3
set style fill solid
plot "<sed 'n;n;G;' myData.txt | awk -f sort.awk" with candlesticks title 'pretty data'

きれいではありませんが、機能します。 sed3 行ごとに空白行を追加し、スタイルawkの出力をフォーマットします。candlesticksgnuplot スクリプトに awk スクリプトを埋め込むこともできます。

于 2012-05-01T23:56:14.073 に答える
1

あなたはそのようなことをすることができます...(UNIXで最も簡単です)。3 行ごとにスペースを挿入する必要があります。これを回避する方法はありません。UNIX を使用している場合は、コマンド

awk 'NR % 3 == 0 {print ""} 1' myfile

するべきです。( awk を使用して n 行ごとに空白行を挿入するにはどうすればよいですか? を参照してください)

もちろん、それを直接 gnuplot ファイルにパックすることもできます (おそらくそうするべきです)。

したがって、すべてのことを言い終えると、次のようになります。

xval(x)=int(x)/3  #Return the x position on the plot
plot "< awk 'NR % 3 == 0 {print ""} 1' datafile" using (xval($1)):2 with lines
于 2012-05-02T13:20:49.047 に答える