2016-10-23 35 views
1

ggplotボックスプロットの外れ値に、外来データが観察された対象の名前を付けたいとします。外れ値ラベルがggplot2ボックスプロットに正しく割り当てられていない

is_outlier <- function(x) { 
    return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x)) 
} 

をそしてsafe_ifelse回避策が要因で適切に機能するためにifelseを取得するには:

私は、外れ値を識別するための簡単な関数を作成することで進めてきました。ここから

safe.ifelse <- function(cond, yes, no) { 
    class.y <- class(yes) 
    if (class.y == "factor") { 
    levels.y = levels(yes) 
    } 
    X <- ifelse(cond,yes,no) 
    if (class.y == "factor") { 
    X = as.factor(X) 
    levels(X) = levels.y 
    } else { 
    class(X) <- class.y 
    } 
    return(X) 
} 

、私は外れ値が正しく識別されますが、それが必要として、標識は動作しませんhttps://www.dropbox.com/s/2pcuuclxiqw1va1/data.csv?dl=0

library(dplyr) data<-subset(data,data$variable1!='NA')

p1<- 
    data %>% 
    group_by(season,location) %>% 
    mutate(outlier=safe.ifelse(is_outlier(variable1),subject,as.numeric(NA))) %>% 
    ggplot(aes(x=factor(season),y=variable1))+ 
    geom_boxplot()+   
    facet_wrap(~location,nrow=2)+ 
    guides(fill=FALSE)+ 
    geom_text(aes(label=outlier),na.rm=TRUE,hjust=1.5,size=2.5) 

でプロットデータを生成するためにdplyrパイプラインを介してデータを実行しました。サブジェクト固有の異常値ラベルを取得するのではなく、3つのレベルのsubjectが繰り返し表示され、誤って(一見無作為に)印刷されます。異常値をそれらの数値でラベル付けする(すなわち、safe_ifelse関数でsubjectからvariable1に変更することによって)問題は発生しません。

私は何かここに明白なものがないと思います。誰かが私が間違っている場所を親切に指摘するかもしれません。

おかげで、 アンドレアス

答えて

0

あなたは一意に外れ値にテキストを表示するために、geom_textにデータをサブセットする必要があります。

data <-data %>% 
    group_by(season,location) %>% 
    mutate(outlier=safe.ifelse(is_outlier(variable1),subject,as.numeric(NA))) 

p1 <- data %>% 
    ggplot(aes(x=factor(season),y=variable1))+ 
    geom_boxplot()+   
    facet_wrap(~location,nrow=2)+ 
    guides(fill=FALSE)+ 
    geom_text(data = data[!is.na(data$outlier),],aes(label=subject),hjust=1.5,size=2.5) 
+0

完了 - ありがとう@ポールシューズ! –

関連する問題