我想在ggplot框图中标记异常值,其中包含观察到外围数据的主题的名称。
我已经开始创建一个简单的函数来识别异常值:
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)
}
从这里开始,我通过dplyr
管道运行数据,以便在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)
虽然正确识别异常值,但标签不能正常工作。而不是获得特定主题的异常值标签,subject
因子的三个级别被重复和错误地(并且看似随机地)打印。通过数值标记异常值(即通过将subject
函数中的variable1
更改为safe_ifelse
)不会导致问题。
我认为我错过了一些明显的东西 - 也许有人可以指出我哪里出错了?
谢谢, 安德烈亚斯
答案 0 :(得分: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)