【问题标题】:Put whisker ends on boxplot将胡须末端放在箱线图上
【发布时间】:2012-10-20 23:18:53
【问题描述】:

我想在胡须的末端放置垂直线,就像 boxplot 函数自动给出的那样。

【问题讨论】:

  • 您可以通过计算 ggplot 绘制线条的分位数并绘制自己的 geom_segmentgeom_crossbar 来做到这一点。见this question
  • 有什么理由为什么必须在 ggplot2 中完成,而不是使用 boxplot 已经做了你想要的,或者这个问题纯粹是学术兴趣......?
  • @Justin 谢谢,我已经检查了这个问题,但它对我来说太高级了,我不断收到错误,我不知道用什么替换哪些位,对不起:/
  • @Jake 这纯粹是审美!我有一个任务需要 2 个图表,一个箱线图,一个交互图。我在 ggplot2 中创建了交互图,并希望箱线图保持一致(轴标签靠近刻度线标签)....
  • @Jake @ Justin 或者,有没有办法可以在基本箱线图中移动轴标签的位置,使它们更靠近刻度线标签并以粗体显示?我确定我太挑剔了,但我希望图表保持一致。

标签: r ggplot2 boxplot


【解决方案1】:

正如@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 中的各种值

【讨论】:

  • 感谢您花时间解释这一点! :)
  • 如果我使用geom_boxplot(width=.2),如何调整这些胡须线的大小?
  • @Produnis 要调整胡须线的大小,请在函数内添加参数stat_params = list(width = 0.5)stat_boxplot。在我的回答中查看结果。
  • @Produnis 和其他人。当前:geom_boxplot(width = 0.2) + stat_boxplot(geom = "errorbar", width = 0.2),箱线图中和误差线中选择的值必须匹配。对于跨越半个盒子的胡须,您可以设置 width = 0.2width = 0.1
【解决方案2】:

要调整胡须线的大小,我们可以在函数内使用参数width = 0.5stat_boxplot

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

【讨论】:

  • 这似乎对我不起作用;我得到Error: Unknown parameters: stat_params。您使用的是哪个版本的 R?
  • @我会修改答案。新版本 ggplo2 2.0.0 不接受该论点 stat_params 。现在它应该可以工作了。
  • 需要注意的一点是,这个解决方案将误差线放在了盒子的顶部,这有点奇怪;有没有办法让竖线不在盒子顶部运行?
  • 太棒了!现在想想就明白了。谢谢!
  • 为了避免盒子顶部的错误栏我做了stat_boxplot(geom = 'errorbar') + geom_boxplot(inherit.aes = TRUE)
【解决方案3】:

也许可以使用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

【讨论】:

    猜你喜欢
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2015-01-11
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多