我试图将boxplot的异常值颜色与美学(scale_colour_discrete)设置的填充颜色相匹配。
这是一个例子。
m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
fill=factor(Animation)))
m + geom_boxplot() + scale_y_log10()
这会在下面生成图表。如何将这些黑点更改为身体中使用的偏红/绿色?如果我理解正确的话,boxplot的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()
答案 0 :(得分:10)
正如@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?。
答案 1 :(得分:5)
我找到了一个解决方案,即设置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)
答案 2 :(得分:4)
我找到了一种方法来编辑原始网格对象。
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)
结果:
答案 3 :(得分:1)
我有一个非常类似的问题。我希望将样式与之前的情节相匹配,因此需要带有彩色填充的黑色边框和匹配的异常值。
我的解决方案是过度打印,一次使用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)
boxplot with coloured fill, and black borders and median line