异常值标签错误地分配了ggplot2框图

时间:2016-10-23 07:22:14

标签: 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))
}

然后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)不会导致问题。

我认为我错过了一些明显的东西 - 也许有人可以指出我哪里出错了?

谢谢, 安德烈亚斯

1 个答案:

答案 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)