一些箱线图改进

Some boxplot improvements

我有一个问题无法解决。假设我有以下代码:

x<-rnorm(100)
x<-append(x,5)
ggplot()+geom_boxplot(aes(y=x),width=3)+scale_y_continuous(breaks=round(c(median(x),summary(x)[['1st Qu.']],summary(x)[['3rd Qu.']],max(x),min(x)),digits=2))

正如您在上面看到的那样,箱线图很大!我怎样才能改变它的宽度?正如您在上面看到的,我尝试通过命令 width 来执行此操作,但它没有用(这对我来说很奇怪,因为我阅读了一些关于此的帖子并且 width 命令正在运行。

我想做的第二件事是标记与箱线图相关的值(如中位数、第一个分位数、第三个分位数、最大值、最小值),但我想始终标记棒的顶部(max() 例如将标记离群值(如果存在)。 正如你在上面看到的,outlier 被 max() 函数标记,但是 upper stick 的顶部没有被标记。有什么办法吗?我试图通过添加到 breaks=() 命令来做到这一点:

 ifelse(max(x)>(3/2*summary(x)[['3rd Qu.']]),max(x[x<3/2*summary(x)[['3rd Qu.']]]),"")

但它不起作用。我的直觉是:如果存在异常值(条件),则标记最接近 3/2* 第三分位数的值的棒顶部。有什么办法可以解决这两个问题吗?

你可以试试:

set.seed(123)

x <- rnorm(100)
x <- append(x,5)

my_breaks <- summary(x)[-4] %>% as.numeric()
my_range <- my_breaks[c(2,4)] + (my_breaks[c(2,4)] %>% diff() * 3/2) * c(-1, 1)
my_breaks <- c(my_breaks, x[x >= my_range[1] & x <= my_range[2]] %>% range())

data <- data.frame(group = factor(0), y = x)

ggplot(data)+
  geom_boxplot(aes(group, y), width = 0.25) +
  labs(x = NULL) +
  scale_y_continuous(breaks = round(my_breaks, 2)) +
  theme(
    axis.title.x=element_blank(),
    axis.text.x=element_blank(),
    axis.ticks.x=element_blank()
  )