2011-10-28 165 views
5

我想在R中繪製箱圖併爲離羣值添加名稱。到目前爲止,我發現了this solutionBoxplot離羣值在R中標記

那裏的函數提供了我需要的所有功能,但是它錯誤地打亂了標籤。在以下示例中,它將異常值標記爲「u」而不是「o」:

library(plyr) 
library(TeachingDemos) 
source("http://www.r-statistics.com/wp-content/uploads/2011/01/boxplot-with-outlier-label-r.txt") # Load the function 
set.seed(1500) 
y <- rnorm(20) 
x1 <- sample(letters[1:2], 20,T) 
lab_y <- sample(letters, 20) 
# plot a boxplot with interactions: 
boxplot.with.outlier.label(y~x1, lab_y) 

您知道任何解決方案嗎? ggplot2庫非常好,但沒有提供這樣的功能(據我所知)。我的選擇是使用text()函數並從boxplot對象中提取異常值信息。但是,像這樣標籤可能會重疊。

非常感謝:-)

+2

更新:我把這個錯誤塔爾加利利的關注,而w /以小時爲單位,他發佈了不再出現此問題的編輯版本的腳本。 –

回答

6

我拿了起來看看這款debug(boxplot.with.outlier.label),而且......原來有一個在功能bug

錯誤發生在行125上,其中data.frame DATAx,ylabel_name構造而成。

此前xy已被重新排序,而lab_y還沒有。當提供的價值x(你的x1)本身不是已經準備好的時候,你會得到你經歷的那種j ling。

作爲一個立即解決,你可以預購x值這樣的(或者做一些更優雅)

df <- data.frame(y, x1, lab_y, stringsAsFactors=FALSE) 
df <- df[order(df$x1), ] 
# Needed since lab_y is not searched for in data (though it probably should be) 
lab_y <- df$lab_y 

boxplot.with.outlier.label(y~x1, lab_y, data=df) 

Boxplot produced by procedure described above

+0

Josh:謝謝。^_^ –

+0

謝謝喬希。前幾天我遇到了同樣的問題,所以這是一個很好的幫助+1 – pssguy

+1

很高興提供幫助。由於這看起來對其他人來說是有用的,所以我只是給腳本的作者發了電子郵件,因爲他在腳本中發現錯誤時要求用戶執行操作。 –

1

intelligent point label placement是一個單獨的問題討論herehere。沒有最終和理想的解決方案,所以你只需要在那裏選擇一個。

所以,你會overplot帶標籤的普通箱線圖,如下:

set.seed(1501) 
y <- c(4, 0, 7, -5, rnorm(16)) 
x1 <- c("a", "a", "b", "b", sample(letters[1:2], 16, T)) 
lab_y <- sample(letters, 20) 

bx <- boxplot(y~x1) 

out_lab <- c() 
for (i in seq(bx$out)) { 
    out_lab[i] <- lab_y[which(y == bx$out[i])[1]] 
} 

identify(bx$group, bx$out, labels = out_lab, cex = 0.7) 

然後,identify()運行期間,您只需點擊定位在您想要的標籤, 描述here。完成後,您只需按下「停止」。 請注意,每個異常值可以有多個標籤!在我的解決方案中,我只是簡單地選擇了第一個! PS:我爲for循環感到羞恥,但不知道如何對它進行矢量化 - 隨時可以改進。

編輯:靈感來自Federico's link現在我發現它可以做得更容易!只是這2個命令:

boxplot(y~x1) 
identify(as.integer(as.factor(x1)), y, labels = lab_y, cex = 0.7) 
+1

identify()解決方案很好,但它不可擴展,我有數百個地塊,我必須將它們打印爲PDF :-) –