2014-09-21 68 views
3

我一直在學習Gnuplot大約一天,並且我想使用boxplot從數據集一覽中發現異常值。從Gnuplot中的boxplot標籤異常

因此,讓我們說我進行實驗:

  • 在10個科目
  • 我做10個課題重複任務的100倍,達到3個具體目標。
  • 我收集他們達到目標1,目標2,目標3的次數。

這些結果都聚集data_File_new.dat下面描述的文件中:

Name Target1 Target2 Target3 
    subject1 10 30 50 
    subject2 11 31 51 
    subject3 9 29 49 
    subject4 12 32 52 
    subject5 8 28 48 
    subject6 13 33 53 
    subject7 7 27 47 
    subject8 50 34 54 
    subject9 6 50 46 
    subject10 15 35 20 

現在,我從這個數據

file = 'data_File_new.dat' 
    header = system('head -1 '.file); 
    N=words(header) 
    set title 'BoxPlot Subject Success' 
    set ylabel 'Number Of Success' 
    set xtics border in scale 0,0 nomirror norotate offset character 0, 0, 0 autojustify 
    set xtics norangelimit 
    set xtics rotate -45 
    set xtics ('' 2) 
    set for [i=2:N] xtics add (word(header, i) i) 
    set style data boxplot 
    plot for [i=2:N] file using (i):i 

創建箱線圖所以結果是離羣是一個箱形圖繪製爲實心點(我想張貼圖片,但我需要10張聲望才能發佈圖片)。它告訴我是否有異常值。 不過,我想知道更多,我想知道誰是離羣,那就是:

  • 受試者8是目標1離羣
  • 主題9爲目標2
  • 離羣除10是目標3

離羣由於gnuplot的知道這些點是異常區,我希望gnuplot的將它們存儲在某種名單。我想告訴Gnuplot '繪製異常值,並將它們與第一列(subjectx)的單詞對應,它們屬於''。

然後,當我打開boxplot我可以識別一目瞭然不僅有異常值,但他們是誰

有誰知道如何做到這一點?我看了論壇,看到一些人在R這樣做,但不是在Gnuplot。

+0

不,你不能自動標註的異常值。統計計算是在內部完成的,您不能將標籤附加到任何結果。你只能在以後,如果你知道的值,使用'標籤'繪圖風格的一些標籤。 – Christoph 2014-09-21 18:20:28

+0

謝謝。我將在R中尋找解決方案。 – Robin74 2014-09-22 01:13:58

+1

@Christoph萬一你有興趣,我已經發布了一個解決方案。 – 2014-09-22 19:25:52

回答

2

這不是gnuplot代碼中最漂亮的一點,但它可以完成!

Gnuplot stats可用於獲取用於生成箱線圖的上下四分位數。然後,您可以使用一些條件代碼來繪製位於with labels範圍之外的點。棘手的部分是,plot命令是作爲字符串構建的,最後是eval。就像我說的,不是太漂亮!

file = 'data_File_new.dat' 
header = system('head -1 '.file) 
N=words(header) 
set title 'BoxPlot Subject Success' 
set ylabel 'Number Of Success' 
set xtics border in scale 0,0 nomirror norotate offset character 0, 0, 0 autojustify 
set xtics norangelimit 
set xtics rotate -45 
set xtics ('' 2) 
set for [i=2:N] xtics add (word(header, i) i) 
r = 1.5 
set style boxplot range r 
unset key 
cmd = "plot for [i=2:N] file using (i):i with boxplot" 
do for [i=2:N] { 
    stats file using i every ::1 nooutput 
    lq = STATS_lo_quartile 
    uq = STATS_up_quartile 
    ir = uq - lq 
    min = lq - r * ir 
    max = uq + r * ir 
    cmd = cmd . sprintf(", file using (%d):($%d < %d || $%d > %d ? $%d : 1/0):1 every ::1 with labels offset 5,0", i, i, min, i, max, i) 
} 
eval cmd 

final plot with labeled outliers