在箱线图上添加须端

57
我想像boxplot函数一样自动在须的两端放置垂直直线。

1
你可以通过计算quantile值并绘制自己的geom_segmentgeom_crossbar来在ggplot中绘制线条。参见此问题 - Justin
1
有什么特殊的原因要使用 ggplot2 进行操作而不是使用 boxplot,因为后者已经实现了你想要的功能。或者这只是纯学术性的问题? - Jake Westfall
@Justin 谢谢,我看了那个问题,但对我来说太高级了,而且我一直在出错,不知道哪些部分该替换成什么,抱歉 :/ - user1762299
@Jake 这只是纯粹的美学需求!我的作业要求绘制两个图表,一个箱线图和一个交互图。我已经在 ggplot2 中创建了交互图,并希望箱线图保持一致(坐标轴标签靠近刻度标签)。 - user1762299
@Jake @Justin 另外,我能否以某种方式移动基本箱线图中轴标签的位置,使其更靠近刻度标签并加粗?我知道我可能太过于挑剔,但我希望图表保持一致。 - user1762299
@Jake @Justin 也许我不会因为ggplot2的箱线图没有在须端有线而失分,但我认为在须端有线的传统箱线图更易于理解各个数值。感谢你们的回复 :) - user1762299
3个回答

72

正如@Roland所暗示但未实现的那样,您可以使用stat_boxplot来实现这一点。关键是调用_boxplot两次,并将一个调用的geom设置为errorbar

请注意,由于R使用笔和纸的方法,建议先实现误差棒,然后在上面绘制传统的箱线图。

使用@Roland的虚拟数据df

ggplot(df, aes(x=cond, y = value))  + 
 stat_boxplot(geom ='errorbar') + 
 geom_boxplot() # shorthand for  stat_boxplot(geom='boxplot')

在此输入图片描述

stat_boxplot 的帮助文档(?stat_boxplot)详细说明了计算并保存在data.frame中的各种值。


谢谢您抽时间来解释这个问题! :) - Carmen Sandoval
1
如果我使用 geom_boxplot(width=.2),我该如何调整这些须线的大小? - Produnis
5
要调整whiskers线的大小,请在函数stat_boxplot中添加参数stat_params = list(width = 0.5)。请查看我回答中的结果。 - mpalanco
2
@Produnis 和其他人。目前:geom_boxplot(width = 0.2) + stat_boxplot(geom = "errorbar", width = 0.2), 其中在箱线图和误差条中选择的值必须匹配。对于跨越半个箱子的须,您需要设置 width = 0.2width = 0.1 - PatrickT

39

为了调整须线的大小,我们可以在函数stat_boxplot中使用参数width = 0.5

set.seed(42)
df <- data.frame(cond = factor(rep(c("A", "B"), each = 500)), 
                 value = c(rnorm(500, mean = 1, sd = 0.2), 
                           rnorm(500, mean = 1.5, sd = 0.1))) 

library(ggplot2)
ggplot(df, aes(x = cond, y = value)) +
       stat_boxplot(geom = "errorbar", width = 0.5) +  
       geom_boxplot() 

输入图像描述


这对我似乎不起作用;我得到了“错误:未知参数:stat_params”。你使用的是哪个版本的R? - Will
@Will 我修改了答案。新版本的ggplo2 2.0.0不再接受stat_params参数。现在应该可以正常工作了。 - mpalanco
太棒了!现在我想起来就很明显了。谢谢! - Will
我尝试使用这个不错的代码与“fill”语句结合来进行子组着色。它在没有设置宽度的情况下可以工作,但是在设置宽度后,不幸的是会导致奇怪的效果。 - Insa
1
为了避免错误条出现在箱子上面,我使用了 stat_boxplot(geom='errorbar') + geom_boxplot(inherit.aes=TRUE) - Fábio
显示剩余2条评论

8

也许可以使用 stat_boxplot 来计算箱线图的须端,但我不是一个足够熟练的 ggplot2 专家,因此我使用了基本函数。

set.seed(42)
df <- data.frame(cond = factor( rep(c("A","B"), each=500) ), 
                 value = c(rnorm(500,mean=1,sd=0.2),rnorm(500, mean=1.5,sd=0.1)))


whisk <- function(df,cond_col=1,val_col=2) {
  require(reshape2)
  condname <- names(df)[cond_col]
  names(df)[cond_col] <- "cond" 
  names(df)[val_col] <- "value"
  b <- boxplot(value~cond,data=df,plot=FALSE)
  df2 <- cbind(as.data.frame(b$stats),c("min","lq","m","uq","max"))
  names(df2) <- c(levels(df$cond),"pos")
  df2 <- melt(df2,id="pos",variable.name="cond")
  df2 <- dcast(df2,cond~pos)  
  names(df2)[1] <- condname
  df2
}



library(ggplot2)

plot1 <- ggplot(df, aes(x=cond)) 
plot1 <- plot1 + geom_errorbar(aes(ymin=min,ymax=max),data=whisk(df),width = 0.5)
plot1 <- plot1 + geom_boxplot(aes(y=value))
plot1

boxplot with horizontal at whisker ends


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接