R 异常值标签与ggplot2方框图分配不正确

R 异常值标签与ggplot2方框图分配不正确,r,plot,ggplot2,R,Plot,Ggplot2,我想在ggplot框中用观察到外围数据的对象的名称标记异常值 我创建了一个简单的函数来识别异常值: is_outlier <- function(x) { return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x)) } 从这里开始,我通过dplyr管道运行数据,以在 库(dplyr) 数据% 变异(离群值=安全的.ifelse(是_离群值(变量1),主题,如.num

我想在ggplot框中用观察到外围数据的对象的名称标记异常值

我创建了一个简单的函数来识别异常值:

is_outlier <- function(x) {
  return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x))
}
从这里开始,我通过
dplyr
管道运行数据,以在

库(dplyr)
数据%
变异(离群值=安全的.ifelse(是_离群值(变量1),主题,如.numeric(NA)))%>%
ggplot(aes(x=因子(季节),y=变量1))+
geom_箱线图()+
面_包裹(~位置,nrow=2)+
辅助线(填充=假)+
geom_文本(aes(标签=异常值),na.rm=真,hjust=1.5,大小=2.5)
虽然异常值得到了正确识别,但标签并没有发挥应有的作用。而不是获得特定于主题的离群值标签,三个级别的
主题
因子被反复错误地打印(而且似乎是随机的)。通过数值标记异常值(即在
safe\u if else
函数中将
subject
更改为
variable1
)不会导致问题

我想我遗漏了一些显而易见的东西——也许有人能指出我哪里出了问题

谢谢,
Andreas

您需要在geom_文本中对数据进行子集,以便在异常值上唯一地显示文本

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)
数据%
按(季节、地点)分组%>%
mutate(outlier=safe.ifelse(is_outlier(variable1),subject,as.numeric(NA)))
p1%
ggplot(aes(x=因子(季节),y=变量1))+
geom_箱线图()+
面_包裹(~位置,nrow=2)+
辅助线(填充=假)+
geom_文本(数据=数据[!is.na(数据$outlier),]),aes(标签=主题),hjust=1.5,大小=2.5)
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)
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)