删除异常值,并针对ggplot2中的每个方面适当减小yLim

时间:2019-12-02 14:27:12

标签: r ggplot2 boxplot

我目前正在使用ggplot2进行多面多面绘图,已清除异常值并将yLim设置为5000。

但是,并不是所有的箱型图(下图开头的箱形图)都可以接近5000。我如何才能减少图像中只有少数几个箱型图的y轴?我已经尝试了社区中的多个答案,但是它们似乎已经过时了。

enter image description here

这是我正在使用的代码:

require(reshape2)
require(ggplot2)

data_frame <- read.csv("results.csv", header=T)

p <- ggplot(data=data_frame, aes(x='', y=value)) + geom_boxplot(outlier.shape=NA, aes(fill=policy))
p <- p + facet_wrap( ~ level, scales="free") + coord_cartesian(ylim = c(0, 5000))
p <- p + xlab("") + ylab("Authorisation Time (ms)") + ggtitle("Title")
ggsave("bplots.png", plot=last_plot(), device=png())

1 个答案:

答案 0 :(得分:1)

如上所述,您几乎必须在绘图之前进行过滤,但这不需要通过编辑任何文件甚至创建新的数据框来完成。使用dplyr,您可以将其链接到数据处理中。我在下面用一些虚构的数据做了一个可复制的示例(因为我没有您的数据)。我创建了一个函数,该函数使用与箱线图相同的过程进行过滤。这有点棘手,但希望可以作为一种潜在的解决方案:

require(ggplot2)
require(dplyr)

data_frame <- data.frame(value = c(rnorm(2000, mean = 100, sd = 20), rnorm(2000, mean = 1000, sd = 500)),
           level = c(rep(1,2000), rep(2, 2000)),
           policy = factor(c(rep(c(rep(1, 500), rep(2, 500), rep(3, 500), rep(4, 500)), 2))))

# filtering function - turns outliers into NAs to be removed
filter_lims <- function(x){
  l <- boxplot.stats(x)$stats[1]
  u <- boxplot.stats(x)$stats[5]

  for (i in 1:length(x)){
    x[i] <- ifelse(x[i]>l & x[i]<u, x[i], NA)
  }
  return(x)
}

data_frame %>% 
  group_by(level, policy) %>%  # do the same calcs for each box
  mutate(value2 = filter_lims(value)) %>%  # new variable (value2) so as not to displace first one)
  ggplot(aes(x='', y=value2, fill = policy)) + 
  geom_boxplot(na.rm = TRUE, coef = 5) +  # remove NAs, and set the whisker length to all included points
  facet_wrap( ~ level, scales="free") + 
  xlab("") + ylab("Authorisation Time (ms)") + ggtitle("Title")

产生以下(简化的)图:

Graph from synthetic data