2015-04-01 56 views
2

我有一大組數據點。我嘗試用boxplot來繪製它們,但某些異常值是完全相同的值,並且它們在一行旁邊表示。我發現How to set the horizontal distance between outliers in gnuplot boxplot,但它並沒有太多幫助,因爲它顯然是不可能的。如何在gnuplot中對boxplot異常值進行組合

是否可以將異常值組合在一起,打印一個點,然後在旁邊的括號內打印一個數字以指示有多少個點?我認爲這會使圖形更具可讀性。

有關信息,我有一個x值的三個boxlot和一個圖中的六個時間。我正在使用gnuplot 5,並且已經使用了分號,這不會再減少距離。 我希望你能幫助!

編輯:

set terminal pdf 
set output 'dat.pdf' 
file0 = 'dat1.dat' 
file1 = 'dat2.dat' 
file2 = 'dat3.dat' 
set pointsize 0.2 
set notitle 
set xlabel 'X' 
set ylabel 'Y' 
header = system('head -1 '.file0); 
N = words(header) 

set xtics ('' 1) 
set for [i=1:N] xtics add (word(header, i) i) 

set style data boxplot 
plot file0 using (1-0.25):1:(0.2) with boxplot lw 2 lc rgb '#8B0000' fs pattern 16 title 'A' 
plot file1 using (1):1:(0.2) with boxplot lw 2 lc rgb '#00008B' fs pattern 4 title 'B' 
plot file2 using (1+0.25):1:(0.2) with boxplot lw 2 lc rgb '#006400' fs pattern 5 title 'C' 
for [i=2:N] plot file0 using (i-0.25):i:(0.2) with boxplot lw 2 lc rgb '#8B0000' fs pattern 16 notitle 
for [i=2:N] plot file1 using (i):i:(0.2) with boxplot lw 2 lc rgb '#00008B' fs pattern 4 notitle 
for [i=2:N] plot file2 using (i+0.25):i:(0.2) with boxplot lw 2 lc rgb '#006400' fs pattern 5 notitle 

這有什麼代碼已經到位,以實現它的最佳方式?

回答

0

沒有選項可以自動完成此操作。在gnuplot的手動執行此操作所需的步驟是:

(在下文中我認爲,數據文件data.dat只有一列。)

  1. stats分析你的數據來確定邊界異常值:

    stats 'data.dat' using 1 
    range = 1.5 # (this is the default value of the `set style boxplot range` value) 
    lower_limit = STATS_lo_quartile - range*(STATS_up_quartile - STATS_lo_quartile) 
    upper_limit = STATS_up_quartile + range*(STATS_up_quartile - STATS_lo_quartile) 
    
  2. 只算異常值,並將其寫入到一個臨時文件

    set table 'tmp.dat' 
    plot 'data.dat' using 1:($1 > upper_limit || $1 < lower_limit ? 1 : 0) smooth frequency 
    unset table 
    
  3. 情節沒有異常值箱線圖,並與labels繪圖風格異常:

    set style boxplot nooutliers 
    plot 'data.dat' using (1):1 with boxplot,\ 
        'tmp.dat' using (1):($2 > 0 ? $1 : 1/0):(sprintf('(%d)', int($2))) with labels offset 1,0 left point pt 7 
    

而這需要爲每一個箱線圖來完成。

免責聲明:此程序應該基本上工作,但沒有示例數據我無法測試它。

+0

謝謝!這個解決方案非常好。唯一的問題是,它打印出每一點,即使那些原本沒有點的地方,如果你用boxplot打印它。你還可以看看我的原始文章中的編輯?我發佈了我現在使用的東西,而且我不得不說我顯然不適應Gnuplot。 ;)是否也可以改變點的大小和數字的大小? PS:它需要在第二個代碼片段中是upper_limit和lower_limit。 ;) – Patrick 2015-04-01 10:09:41

+0

當繪製標籤時,你必須檢查計數的數量是否> 0,我編輯了答案。你可以像往常一樣改變分數。 'ps 2',你也可以使用'font'選項來繪製'標籤',比如'plot ... with labels font',12''。 – Christoph 2015-04-01 11:06:38

+0

出於測試目的,我使用了pdf終端,但我想在最後使用它與cairolatex。我意識到,cairolatex的點和標籤根本不打印。你知道一個方法來繞過它嗎? – Patrick 2015-04-01 13:40:35

相關問題