一些箱线图改进

问题描述

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

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

enter image description here

正如您在上面看到的那样,那个箱线图是巨大的!如何更改宽度?如您在上面所看到的,我尝试通过命令width来执行此操作,但是它没有用(这对我来说很奇怪,因为我阅读了一些有关此的文章,并且width命令正在运行。

我想做的第二件事是标记与箱线图相关的值(如中位数,第一分位数,第三分位数,最大值,最小值),但我想始终标出顶部(max()例如,如果存在则将标记异常值)。 如上所见,离群值由max()功能标记,但未标记上杆的顶部。有什么办法可以做到吗?我试图通过添加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()
  )

enter image description here