Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 箱线图,如何匹配异常值';用颜色来填充美学?_R_Ggplot2 - Fatal编程技术网

R 箱线图,如何匹配异常值';用颜色来填充美学?

R 箱线图,如何匹配异常值';用颜色来填充美学?,r,ggplot2,R,Ggplot2,我试图将箱线图的异常值颜色与美学设置的填充颜色相匹配(比例\颜色\离散) 这里有一个例子 m <- ggplot(movies, aes(y = votes, x = factor(round(rating)), fill=factor(Animation))) m + geom_boxplot() + scale_y_log10() m我找到了一种方法,编辑原始网格对象 library(ggplot2) match.ol.col <- function(plt,aes.

我试图将箱线图的异常值颜色与美学设置的填充颜色相匹配(比例\颜色\离散)

这里有一个例子

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

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

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

match.ol.col正如@koshke所说,通过设置
outlier.color=NULL
,现在可以很容易地将异常值着色为框中的线条(而不是填充颜色):

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

m我找到了一个解决方案,解决了设置
geom_箱线图(outlier.color=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()
通过阅读github上的以下内容找到了解决方案:

geom_boxplot()
的异常值使用
geom_point()
。使用更改
geom_point()
的默认值
update\u geom\u defaults()
将对
geom\u boxplot()
。更改异常值的默认值以前是不允许的 可能的(@ThierryO,#757)


也在这里发布:

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

我的解决方案是过度打印,一次使用color=和默认的实心圆点,一次使用fill=和开放圆点形状

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

p这在当前版本中是不可能的,但在下一个版本中是可能的。@kohske,也许你仍然可以从你的评论中找到答案。如果yosukesabai接受这个答案,那么SO社区很清楚这个问题已经解决了。(这给你带来了一些代表:)。事实上,我找到了科斯基的答案,也许可以用来解决我的问题。希望它不会太糟糕…@kohske,你能详细说明一下新版本和时间框架会修正什么吗?我只是用position='dodge'处理不同的几何体,前提是x比例是离散的。这就是正在进行的吗?@JoshO'Brien,我认为我的“解决方案”是不可接受的。。。当我知道如何避开这两个数据集时,我会照你说的做。谢谢你的评论。在我接受你的答案之前,我试着检查你的答案是否有效,但不知怎的,我的R安装搞砸了。我相信你,我只是接受了你的回答@吉泽白:对于老问题,不要急于接受迟来的答案。希望你的安装能再次正常工作。请注意,正如OP标题所示,这与填充颜色不匹配,但它与轮廓/线条颜色匹配,这正是我所需要的+1@RyanStochastic:你说得对-我刚从另一篇文章中抄来。但是,设置填充颜色很简单。这个解决方案似乎不再适用于ggplot2 1.0.0和R 3.1.1。您知道如何为新版本获得匹配的异常值颜色吗?您也可以在第二次调用中执行
geom_boxplot
中的
outlier.color=NA
。使用
ggplot2
2.2.1,我发现不需要套印
p+geom_盒形图(aes(填充=因子(cyl)),outlier.shape=21)
足以在与框填充匹配的异常点中获得填充颜色。
update_geom_defaults("point", list(colour = "black"))
p <- ggplot(mtcars, aes(factor(cyl), mpg))
p + geom_boxplot(aes(colour=factor(cyl))) + 
    geom_boxplot(aes(fill=factor(cyl)), outlier.shape=21)