varias superponer paletas los leyenda graficas ggplot escala ejes como colores cambiar barras r ggplot2

superponer - ggplot2: ¿Varias escalas de color o colores de cambio sistemáticamente en diferentes capas?



superponer graficas en r ggplot (4)

La sintaxis de ggplot2 parece haber cambiado, y dado que me llevó un poco averiguarlo:

el fill=0 (para mí) no tiene ningún efecto (¿ya?)

sin embargo, debe cambiarse a alpha=0 para que la casilla sea transparente:

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,alpha=0, outlier.size=0)+ geom_boxplot(size=1.4,alpha=0, outlier.size=0, color=alpha("black",0.3))

editar: Acabo de enterarme, ese cambio de fill=0 para fill=NA también lo hace ...

Cuando hago diagramas de cajas, me gusta mostrar también los datos brutos en segundo plano, así:

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)

Sin embargo, no me gusta cómo desaparecen los diagramas de mi caja cuando los puntos se vuelven demasiado densos. Sé que puedo ajustar alpha , lo cual está bien en algunos casos, pero no cuando mis grupos tienen densidades variables (Por ejemplo, cuando el grupo más ligero desaparecería por completo si tuviera que disminuir el alpha suficiente para que el grupo más oscuro no oscurezca la caja trama). Lo que trato de hacer es cambiar sistemáticamente los colores de los diagramas de caja, un poco más oscuros, tal vez, para que aparezcan incluso cuando los puntos de fondo estén al máximo del alfa. Por ejemplo:

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)

Hasta ahora no he encontrado una manera de falsificar en un scale_color diferente para la capa geom_boxplot (que parecería la ruta más simple si hay una manera de hacerlo). Tampoco he podido encontrar una sintaxis simple para ajustar sistemáticamente los colores de la misma manera que puede compensar fácilmente una estética continua como aes(x=x+1) .

Lo más cercano que he podido conseguir es duplicar por completo los niveles del factor ...

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)

pero luego tengo que lidiar con esa fea leyenda. Alguna mejor idea?


Por ahora, puedes definir tu propia versión de GeomBoxplot (llamándola, por ejemplo, GeomPlotDark ), que difiere de la original solo en que primero ''oscurece'' los colores antes de trazarlos.

Con proto, puedes hacer esto creando un objeto proto, GeomBoxplotDark , que hereda de GeomBoxplot , y difiere solo en su función de draw . La mayor parte de la definición de la función de draw se toma de las fuentes de GeomBoxplot ; He anotado las líneas que cambié con comentarios como este # ** ... ** :

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), ...) ))) } )

A continuación, cree un geom_boxplot_dark() para ser llamado por el usuario, y que envuelva apropiadamente la llamada a 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, ...)

Finalmente, pruébelo con un código casi idéntico a su llamada original, simplemente sustituyendo una llamada a geom_boxplot_dark() por la llamada a 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)

Creo que la trama resultante parece bastante ingeniosa. Con un poco de ajuste, y visto directamente (no como un archivo subido), se verá impresionante:


Puede hackear la leyenda Grob, pero parece difícil ubicarlo.

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"))))


Última respuesta agregada en noviembre de 2012:

Dado que algunas de estas respuestas fabulosas requieren versiones anteriores de ggplot2 y la gente todavía se está refiriendo a esta página, la actualizaré con la solución ridículamente simple que he estado usando con ggplot2 0.9.0+.

Simplemente agregamos una segunda capa geom_boxplot que es idéntica a la primera, excepto que asignamos un color constante usando scales::alpha() para que se muestre el primer cuadro de caja.

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))

editar: TobiO señala que fill=0 ha dejado de funcionar. En cambio, fill=NA o alpha=0 puede ser sustituido. Esto parece deberse a un cambio en col2rgb() comienza en R 3.0.0.