当我制作盒子图时,我也喜欢在后台显示原始数据,如下所示:
library(ggplot2)
library(RColorBrewer)
cols = brewer.pal(9, 'Set1')
n=10000
dat = data.frame(value=rnorm(n, 1:4), group=factor(1:4))
ggplot(dat, aes(x=group, y=value, color=group, group=group)) +
geom_point(position=position_jitter(width=0.3), alpha=0.1) +
scale_color_manual(values=cols) +
geom_boxplot(fill=0, outlier.size=0)
Run Code Online (Sandbox Code Playgroud)

但是,我不喜欢它当点太密集时我的盒子图完全消失了.我知道我可以调整alpha,这在某些情况下很好,但是当我的团队密度不同时(例如,如果我减少alpha到最轻的组会完全消失,以便最暗的组不会遮挡框图) .我正在尝试做的是系统地改变箱形图的颜色 - 可能有点暗 - 这样即使背景点最大化了alpha,它们也会出现.例如:
plot(1:9, rep(1, 9), pch=19, cex=2, col=cols)
cols_dk = rgb2hsv(col2rgb(brewer.pal(9, 'Set1'))) - c(0, 0, 0.2)
cols_dk = hsv(cols_dk[1,], cols_dk[2,], cols_dk[3,])
points(1:9, rep(1.2, 9), pch=19, cex=2, col=cols_dk)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我还没有找到一种方法来伪造一个不同scale_color的geom_boxplot层(如果有办法,这似乎是最简单的路线).我也没有能够找到一种简单的语法来系统地调整颜色,就像你可以轻松地抵消连续美学一样aes(x=x+1).
我能得到的最接近的是完全复制因子的水平......
ggplot(dat, aes(x=group, y=value, color=group, group=group)) +
geom_point(position=position_jitter(width=0.3), alpha=0.1) +
scale_color_manual(values=c(cols[1:4], cols_dk[1:4])) +
geom_boxplot(aes(color=factor(as.numeric(group)+4)), fill=0, outlier.size=0)
Run Code Online (Sandbox Code Playgroud)

但后来我必须处理那个丑陋的传说.有更好的想法吗?
Mat*_*agg 21
2012年11月晚期回答:
由于其中一些极好的答案需要较旧的ggplot2版本,人们仍然指的是这个页面,我将使用ggplot2 0.9.0+一直使用的荒谬简单的解决方案来更新它.
我们只是添加第二个geom_boxplot图层,它与第一个图层相同,只是我们使用scales::alpha()第一个boxplot显示的方式分配一个常量颜色.
library(scales) # for alpha function
ggplot(dat, aes(x=group, y=value, color=group, group=group)) +
geom_point(position=position_jitter(width=0.3), alpha=0.2) +
geom_boxplot(size=1.4,fill=0, outlier.size=0)+
geom_boxplot(size=1.4,fill=0, outlier.size=0, color=alpha("black",0.3))
Run Code Online (Sandbox Code Playgroud)
编辑: TobiO指出fill=0已停止工作.相反,fill=NA或者alpha=0可以替代.这似乎是由于col2rgb()R 3.0.0 中的起始变化.

Jos*_*ien 14
现在,您可以定义自己的版本GeomBoxplot(称之为GeomPlotDark),与原始版本不同,只是在绘制颜色之前先将颜色"变暗".
使用proto,您可以通过创建一个原型对象来实现这一目标,该原型对象的GeomBoxplotDark继承GeomBoxplot和仅在其draw功能上有所不同.draw函数的大部分定义取自GeomBoxplot源代码; 我用这样的评论注释了我改变的行# ** ... **:
require(ggplot2)
GeomBoxplotDark <- proto(ggplot2:::GeomBoxplot,
draw <- function(., data, ..., outlier.colour = "black", outlier.shape = 16, outlier.size = 2) {
defaults <- with(data, { # ** OPENING "{" ADDED **
cols_dk <- rgb2hsv(col2rgb(colour)) - c(0, 0, 0.2) # ** LINE ADDED **
cols_dk <- hsv(cols_dk[1,], cols_dk[2,], cols_dk[3,]) # ** LINE ADDED **
data.frame(x = x, xmin = xmin, xmax = xmax,
colour = cols_dk, # ** EDITED, PASSING IN cols_dk **
size = size,
linetype = 1, group = 1, alpha = 1,
fill = alpha(fill, alpha),
stringsAsFactors = FALSE
)}) # ** CLOSING "}" ADDED **
defaults2 <- defaults[c(1,1), ]
if (!is.null(data$outliers) && length(data$outliers[[1]] >= 1)) {
outliers_grob <- with(data,
GeomPoint$draw(data.frame(
y = outliers[[1]], x = x[rep(1, length(outliers[[1]]))],
colour=I(outlier.colour), shape = outlier.shape, alpha = 1,
size = outlier.size, fill = NA), ...
)
)
} else {
outliers_grob <- NULL
}
with(data, ggname(.$my_name(), grobTree(
outliers_grob,
GeomPath$draw(data.frame(y=c(upper, ymax), defaults2), ...),
GeomPath$draw(data.frame(y=c(lower, ymin), defaults2), ...),
GeomRect$draw(data.frame(ymax = upper, ymin = lower, defaults), ...),
GeomRect$draw(data.frame(ymax = middle, ymin = middle, defaults), ...)
)))
}
)
Run Code Online (Sandbox Code Playgroud)
然后创建一个geom_boxplot_dark()由用户调用,并适当地将调用包装到GeomBoxplotDark$new():
geom_boxplot_dark <- function (mapping = NULL, data = NULL, stat = "boxplot", position = "dodge",
outlier.colour = "black", outlier.shape = 16, outlier.size = 2,
...)
GeomBoxplotDark$new(mapping = mapping, data = data, stat = stat,
position = position, outlier.colour = outlier.colour, outlier.shape = outlier.shape,
outlier.size = outlier.size, ...)
Run Code Online (Sandbox Code Playgroud)
最后,尝试使用几乎与原始呼叫相同的代码,只需将呼叫替换geom_boxplot_dark()为以下呼叫geom_boxplot():
library(ggplot2)
library(RColorBrewer)
cols = brewer.pal(9, 'Set1')
n=10000
dat = data.frame(value=rnorm(n, 1:4), group=factor(1:4))
ggplot(dat, aes(x=group, y=value, color=group, group=group)) +
geom_point(position=position_jitter(width=0.3), alpha=0.1) +
scale_color_manual(values=cols) +
geom_boxplot_dark(fill=0, outlier.size=0)
Run Code Online (Sandbox Code Playgroud)
我认为结果情节看起来很漂亮.通过一些调整,直接查看(不是上传文件),它看起来很棒:

你可以破解传说中的grob,但似乎很难放置它.
g = ggplotGrob(p)
grid.draw(g)
legend = editGrob(getGrob(g, gPath("guide-box","guide"), grep=TRUE), vp=viewport())
new = removeGrob(legend, gPath("-7|-8|-9|-10"), grep=TRUE, glob=T)
## grid.set(gPath("guide-box"), legend, grep=TRUE) # fails for some reason
grid.remove(gPath("guide-box"), grep=TRUE, global=TRUE)
grid.draw(editGrob(new, vp=viewport(x=unit(1.4,"npc"), y=unit(0.1,"npc"))))
Run Code Online (Sandbox Code Playgroud)
