3

職場では、CDFを並べ替えて計算し、gnuplot内にプロットする浮動小数点値のセットがあります。CDFの80%と90%のしきい値がどこにあるかを示す線を描きたいと思います。つまり、0.8 yティックマークで左から入ってくる線で、グラフに触れてから、その値にドロップダウンします。 。これは、視聴者の目を導くのに役立ちます。

データは自動的に生成され、複数のプロットを作成するので、毎回これらの線を手作りする必要はありません。

0.8および0.9のy値ポイントでプロットを完全に横切る水平矢印を描画するのは簡単ですが、垂直線を描画する場所を決定する方法がわかりません。aq / a wrt描画矢印は次のとおりです。gnuplot:特定の位置の垂直線ですが、位置は事前にわかっています。

ここにいくつかのサンプルデータがあります(私の作業マシンはインターネットにアクセスできないため、共有は困難です)

  X                Y
 5.0   |         0.143
 8.0   |         0.288
16.0   |         0.429
25.0   |         0.714
39.0   |         0.857
47.0   |         1.000

何か案は?

4

2 に答える 2

4

これが私の見解です(パーセンタイルランクを使用)。これは、一変量の一連の測定値が利用可能であることのみを前提としています(列の見出しはX)。事前に計算された累積頻度で動作するように少し調整したい場合がありますが、それはそれほど難しいことではありません。

# generate some artificial data
reset
set sample 200
set table 'rnd.dat'
plot invnorm(rand(0))
unset table

# display the CDF
unset key
set yrange [0:1]
perc80=system("cat rnd.dat | sed '1,4d' | awk '{print $2}' | sort -n | \
          awk 'BEGIN{i=0} {s[i]=$1; i++;} END{print s[int(NR*0.8-0.5)]}'")
set arrow from perc80,0 to perc80,0.8 nohead lt 2 lw 2
set arrow from graph(0,0),0.8 to perc80,0.8 nohead lt 2 lw 2
plot 'rnd.dat' using 2:(1./200.) smooth cumulative

これにより、次の出力が得られます。

ここに画像の説明を入力

もちろん、パーセンタイル値はいくつでも追加できます。たとえば、新しい変数を定義し、perc90他の 2 つのarrowコマンドを要求し、 0.8(ああ... 魔法の数字の喜び!) が出現するたびに目的のもの (この場合は 0.9) に置き換えるだけです。

上記のコードに関するいくつかの説明:

  1. ディスクに保存された人工データセットを生成しました。
  2. 80 パーセンタイルは awk を使用して計算されますが、その前に次のことを行う必要があります。
    1. table(最初の 4 行)によって生成されたヘッダーを削除します。(awk に 5 行目から開始するように指示することもできますが、それで進めます。)
    2. 2 番目の列のみを保持します。
    3. エントリを並べ替えます。
  3. 80 パーセンタイルを計算する awk コマンドには切り捨てが必要です。これは、ここで提案されているように行われます。(R ではtrunc(rank(x))/length(x)、パーセンタイル ランクを取得するような関数を使用するだけです。)

R を試してみたい場合は、その長い一連の sed/awk コマンドを次のような R の呼び出しに安全に置き換えることができます。

Rscript -e 'x=read.table("~/rnd.dat")[,2]; sort(x)[trunc(length(x)*.8)]'

rnd.datホームディレクトリにあると仮定します。


補足:そして、gnuplot なしで生活できる場合は、そのようなグラフィックスを行うためのいくつかの R コマンドを次に示します (quantile関数を使用しなくても):

x <- rnorm(200)
xs <- sort(x)
xf <- (1:length(xs))/length(xs)
plot(xs, xf, xlab="X", ylab="Cumulative frequency")
## quick outline of the 80th percentile rank
perc80 <- xs[trunc(length(x)*.8)]
abline(h=.8, v=perc80) 
## alternative solution
plot(ecdf(x))
segments(par("usr")[1], .8, perc80, .8)
segments(perc80, par("usr")[3], perc80, .8)

ここに画像の説明を入力

于 2012-01-26T17:35:12.903 に答える
0

を使用awkして、特定の値で線を計算できます。

Data.csv次のようなデータファイルがある場合:

0     1
1     4
2     9
3    16
4    25
5    36
6    49
7    64
8    81
9   100

あなたはそれをプロットすることができます

plot "Data.csv" u 1:2 w l

2 番目の列の最大値 (この場合は 90) の 90% で線を描画する場合は、awk スクリプトを実行します。その目的は、最小および最大の x 値と、最大の y 値の 90% の値を特定することです。次のようになります。

awk '
{
if(x_min == "") {x_min = x_max = $1; y_max = $2}; 
if($1 > x_max) {x_max = $1}; 
if($1 < x_min) {x_min = $1}; 
if(y_max < $2) {y_max = $2}} 
END {
print x_min, y_max * 0.9; 
print x_max, y_max * 0.9
}' Data.csv

基本的にそれが行うことは次のとおりです。

  1. が存在するかどうか、設定されx_minていないかどうかを確認し、 の 1 列目または 2 列目にします。x_minx_maxy_maxData.csv

  2. 現在の最初の列が現在の よりも大きいかどうかを確認し、大きい場合は、現在の最初の列の値にx_min設定x_minします。

  3. andに相当することをx_max行いy_maxます (注: 2 番目の列の最大値のみが必要で、最小値は必要ありません)。

  4. データ ファイルをループした後、次のように結果を出力します。

    x_min y_max * 0.9
    x_max y_max * 0.9
    

これを gnuplot で機能させるために、上記のスクリプトを次のように追加します。

plot "Data.csv" u 1:2 w l, \
     "< awk '{if(x_min == \"\") {x_min = x_max = $1; y_max = $2}; if($1 > x_max) {x_max = $1}; if($1 < x_min) {x_min = $1}; if(y_max < $2) {y_max = $2}} END {print x_min, y_max * 0.9; print x_max, y_max * 0.9}' Data.csv" u 1:2 w l

\"gnuplot スクリプトの に注意してください。"gnuplot がそれらにつまずかないようにするには、エスケープする必要があります...

結局のところ、次のようなプロットになるはずです。

ここに画像の説明を入力

緑の線は、最大 y 値の 90% の値を示します。

于 2012-01-24T14:14:03.900 に答える