如何在ggplot2中修改boxplot的胡须?

Anj*_*jaM 6 r ggplot2 boxplot

我将从一个MWE开始:

library(ggplot2)

p <- ggplot(mtcars, aes(factor(cyl), mpg, fill = factor(am)))
p + geom_boxplot()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想修改胡须的颜色,例如,将其设置为红色.我认为不可能直接做到这两点geom_boxplot,所以这是我的解决方法:

library(Hmisc)

stat_sum_df <- function(fun, geom = "crossbar", ...) {
  stat_summary(fun.data = fun, geom = geom, width = 0.4, ...)
}

p + stat_boxplot(geom = 'linerange', colour = "red", position = "dodge) +
    stat_sum_df("median_hilow", conf.int = 0.5, position = "dodge") 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

线范围堆叠在一起.接下来尝试:

p + stat_boxplot(geom = 'linerange', colour = "red", position = position_dodge(width = .5)) +
   stat_sum_df("median_hilow",conf.int=0.5, position = position_dodge(width = .5))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

看起来更好,但现在盒子之间有一个固定的空间(比较第一和第三个图上的cyl = 8).由于我将使用这个代码用于不同级别的am(当然在我的实际数据中,它不是am),我事先并不知道盒子本身有多宽,所以我不能设置一个固定的width对于linerange没有指定固定width的框.

有没有办法选择性地修改a的胡须boxplotlinerange根据框之间的空间调整元素之间的空间?

sha*_*dow 8

如何将两个箱图绘制在一起.一个有红色线条,另一个有红色线条,根本没有任何信号.

p + geom_boxplot(color="red") + geom_boxplot(aes(ymin=..lower.., ymax=..upper..)) 
Run Code Online (Sandbox Code Playgroud)


mpa*_*nco 7

另一种选择是绘制误差条,并在其上面绘制没有胡须的箱形图:

library(ggplot2)
p + stat_boxplot(geom = "errorbar", colour = "red") + 
  geom_boxplot(coef = 0, outlier.size = 0)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述