ggplot2:在不同的图层上有多个颜色标度或移动颜色?

当我做箱形图时,我也喜欢在后台显示原始数据,像这样:

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)

然而,我不喜欢它的盒子地块完全消失时,点太密集。我知道我可以调整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)

到目前为止,我没有找到一种方法伪造一个不同的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)

但后来我要处理这个丑陋的传说。任何更好的想法?

现在,你可以定义自己的版本的GeomBoxplot(称为GeomPlotDark),与原始版本不同,因为它首先在绘制之前“加深”颜色。

使用proto,您可以通过创建一个从GeomBoxplot继承的原始对象GeomBoxplotDark来实现,并且仅在其绘制函数中有所不同。大多数绘制函数的定义取自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), ...)
    )))
  }
)

然后创建一个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, ...)

最后,尝试使用与原始调用几乎相同的代码,只需要调用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)

我认为所得的情节看起来漂亮漂亮。有一点调整,直接查看(不是一个上传的文件),它会看起来真棒:

翻译自:https://stackoverflow.com/questions/9232331/ggplot2-multiple-color-scales-or-shift-colors-systematically-on-different-layer

转载注明原文:ggplot2:在不同的图层上有多个颜色标度或移动颜色?