2014-02-27 63 views
4

我将用一个MWE开始:如何在ggplot2中修改boxplot的胡须?

library(ggplot2) 

p <- ggplot(mtcars, aes(factor(cyl), mpg, fill = factor(am))) 
p + geom_boxplot() 

enter image description here

我想修改的胡须的颜色,例如,将其设置为红色。我不认为这是可以直接这样做既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") 

enter image description here

行范围堆放在彼此的顶部。所以,下一次尝试:

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

enter image description here

看起来更好,但现在有框之间的固定空间(比较上第一和第三情节CYL = 8)。由于我打算使用此代码的不同级别的am(当然,在我的真实数据中,它不是am),我事先并不知道盒子本身有多宽,所以我无法设置一个固定的widthlinerange而没有为箱子指定固定的width

有一种方法或者有选择地修改一个boxplot的晶须或根据框之间空间linerange元件之间调整空间?

+1

不完全是简单,但一个方式可以是建立在顶部的两个箱图彼此的。在其中一个你删除胡须和异常值(这样只有盒子可见),并绘制在第二个boxplot(包括胡须),你将其改变为红色.. – beetroot

回答

6

如何绘制两个盒形图在彼此之上。一个红线,另一个上面没有任何wiskers。

p + geom_boxplot(color="red") + geom_boxplot(aes(ymin=..lower.., ymax=..upper..)) 
+0

谢谢,这完美的作品!只是一个问题:'..lower..'和'..upper..'的意思是什么? – AnjaM

+1

原始data.frame实际上并没有“lower”列。这个变量是在'stat_boxplot'调用中创建的。可以使用在ggplot stats中创建的变量,只需在名称前后添加两个点即可。类似和经常使用的是'geom_bin(aes(y = ..density ..))'。 – shadow

+0

好的,非常感谢! – AnjaM

2

另一种选择是绘制错误条和在它们上面的箱线图无胡须:

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

enter image description here