【问题标题】:Boxplot, how to match outliers' color to fill aesthetics?Boxplot,如何匹配异常值的颜色来填充美学?
【发布时间】:2011-12-14 04:09:15
【问题描述】:

我正在尝试将箱线图的异常值颜色与美学 (scale_colour_discrete) 设置的填充颜色相匹配。

这是一个例子。

m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
    fill=factor(Animation)))
m + geom_boxplot() + scale_y_log10()

这会生成下面的图。如何将那些黑点更改为身体中使用的红色/绿色?如果我理解正确,箱线图的 outlier.colour 选项似乎选择了一种颜色,而不是美学。如果有帮助,我不介意使用色彩美学。


编辑:

改编自this solution (Changing whisker definition in geom_boxplot)。 stats_summary 重置了水平闪避,我不知道如何将其恢复。我会根据需要删除异常值和拉伸胡须,因为我现在知道如何操作了。

# define the summary function
f <- function(x) {
  r <- quantile(x, probs = c(0.05, 0.25, 0.5, 0.75, 0.95))
  names(r) <- c("ymin", "lower", "middle", "upper", "ymax")
  r
}
# define outlier function, beyound 5 and 95% percentiles
o <- function(x) {
  subset(x, x < quantile(x,probs=c(0.05))[1] | quantile(x,probs=c(0.95))[1] < x)
}

m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
    colour=factor(Animation)))
m <- m + stat_summary(fun.data=f, geom='boxplot')
m <- m + stat_summary(fun.y=o, geom='point', aes(colour=factor(Animation)))
m + scale_y_log10()

【问题讨论】:

  • 这在当前版本中是不可能的,但在下一个版本中将是可能的。
  • @kohske,也许你仍然可以从你的评论中得到答案。如果 yosukesabai 接受这个答案,那么 SO 社区就很清楚这个问题已经解决了。 (它给你一些代表:))。
  • 其实我找到了kohske的回答"Changing whisker definition in geom_boxplot",可能适合解决我的问题。希望不会太恶心...
  • @kohske,您能否详细说明新版本中将修复的内容和时间框架?如果 x 比例是离散的,我只是使用 position='dodge' 跨不同的几何图形工作。这是正在进行的事情吗?
  • @JoshO'Brien,我不认为我的“解决方案”是可以接受的......当我弄清楚如何将这两个数据集分开时,我会照你说的做。感谢您的评论。

标签: r ggplot2


【解决方案1】:

正如@koshke 所说,现在可以通过设置outlier.colour = NULL 轻松地将异常值着色为框线(而不是填充颜色):

m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
    colour = factor(Animation)))
m + geom_boxplot(outlier.colour = NULL) + scale_y_log10()

  • outlier.colour 必须写成“ou”
  • outlier.colour 必须在 aes () 之外

我将其发布为较晚的答案,因为我发现自己一遍又一遍地查找此问题,并且我还将其发布为相关问题 Coloring boxplot outlier points in ggplot2?

【讨论】:

  • 在我接受你的答案之前,我试图检查你的答案是否有效,但不知何故我的 R 安装搞砸了。我相信你,只是让它接受了答案!
  • @yosukesabai:不急于接受旧问题的迟到答案。希望您的安装再次正常运行。
  • 请注意,这与 OP 的标题所暗示的填充颜色不匹配,但它与轮廓/线条颜色匹配——这正是我所需要的。 +1
  • @RyanStochastic:你说得对——我只是从另一篇文章中复制过来的。但是,设置填充颜色很简单。
  • 这个解决方案似乎不再适用于 ggplot2 1.0.0 和 R 3.1.1。任何想法如何为新版本获得匹配的异常颜色?
【解决方案2】:

我找到了一个解决方案,即设置 geom_boxplot(outlier.colour = NULL) 在最新版本的 R 中不再起作用(@jonsnow 谈到 ggplot2 的 1.0.0 版本)。

为了复制@cbeleites 提出的行为,您只需使用以下代码:

update_geom_defaults("point", list(colour = NULL))
m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
            colour = factor(Animation)))
m + geom_boxplot() + scale_y_log10()

正如预期的那样,这会产生与线条颜色匹配的点。

如果需要绘制多张图,当然要记得恢复默认值:

update_geom_defaults("point", list(colour = "black"))

通过阅读github上的ggplot2 changelog找到解决方案:

geom_boxplot() 的异常值使用默认的颜色、大小和形状 geom_point()。更改 geom_point() 的默认值 update_geom_defaults() 将对异常值应用相同的更改 geom_boxplot()。以前没有更改异常值的默认值 可能的。 (@ThierryO,#757)

也在这里发布:Coloring boxplot outlier points in ggplot2?

【讨论】:

    【解决方案3】:

    我找到了一种方法,即编辑原始网格对象。

    library(ggplot2)
    
    match.ol.col <- function(plt,aes.cp='fill') {
      # matches outliers' color to either fill or colour aesthetics
      #   plt: ggplot layer object having boxplot
      #   aes.cp: aetsthetic from which copy color.  must be either 'fill' or 'col'
      # returns grid objects, so print it wigh grid.draw(), not print()
      if (aes.cp %in% c('color', 'colour')) aes.cp <- 'col'
      grob <- ggplotGrob(plt)
      bps <- getGrob(grob, 'boxplots', grep=T)
      for (bp in bps$children) {
        p <- getGrob(bp, 'point', grep=T)
        if (is.null(p)) next
        r <- getGrob(bp, 'rect', grep=T)
        grob <- geditGrob(grob, p$name, gp=gpar(col=r$gp[[aes.cp]]))
      }
      return(grob)
    }
    
    
    m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
        colour=factor(Animation)))
    p <- m + geom_boxplot() + scale_y_log10()
    
    grob <- match.ol.col(p, aes.cp='colour')
    grid.draw(grob)
    

    结果:

    【讨论】:

      【解决方案4】:

      我有一个非常相似的问题。我想将样式与之前的情节相匹配,所以想要黑色边框和彩色填充,并匹配异常值。

      我的解决方案是叠印,一次使用 colour= 和默认的实心圆点,一次使用 fill= 和一个开放的圆点形状

      p <- ggplot(mtcars, aes(factor(cyl), mpg))
      p + geom_boxplot(aes(colour=factor(cyl))) + 
          geom_boxplot(aes(fill=factor(cyl)), outlier.shape=21)
      

      boxplot with coloured fill, and black borders and median line

      【讨论】:

      • 你也可以在第二个geom_boxplot调用中调用outlier.colour = NA
      • 使用ggplot2 2.2.1,我发现不需要套印。 p + geom_boxplot(aes(fill=factor(cyl)), outlier.shape=21) 足以在与框填充匹配的异常点中获得填充颜色。
      猜你喜欢
      • 2022-12-09
      • 2021-10-31
      • 1970-01-01
      • 2020-11-30
      • 2020-10-03
      • 1970-01-01
      • 2021-02-15
      • 2020-01-25
      • 1970-01-01
      相关资源
      最近更新 更多