resueltos - prueba de dixon en excel
Gráfico de caja, ¿cómo hacer coincidir el color de los valores atípicos con la estética? (4)
Estoy tratando de hacer coincidir el color de los valores atípicos de boxplot con el color de relleno establecido por la estética (scale_colour_discrete).
Aquí hay un ejemplo.
m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
fill=factor(Animation)))
m + geom_boxplot() + scale_y_log10()
Esto genera la trama a continuación. ¿Cómo puedo cambiar los puntos negros para que sean colores rojizos / verdosos que se usan en el cuerpo? La opción de color outlier.colour de boxplot parece elegir un color, y no como estética, si lo entiendo correctamente. No me importa usar la estética del color si eso ayuda.
Editar:
Adapté esta solución (cambiando la definición de bigotes en geom_boxplot) . Las esquivaciones horizontales se restablecen mediante stats_summary y no pude averiguar cómo recuperarlas. Probablemente dejaría los valores atípicos y estiraría los bigotes según fuera necesario, ya que ahora sé cómo.
# 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()
Como dijo @koshke, ahora es posible tener los valores atípicos como las líneas de la caja (no el color de relleno) configurando 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
debe escribirse con "ou" -
outlier.colour
debe estar fuera deaes ()
Estoy publicando esto como una respuesta tardía porque me encuentro buscando esto una y otra vez, y también lo publiqué para la pregunta relacionada Coloring boxplot outlier points in ggplot2? .
Encontré una manera de hacer esto, editando objeto de cuadrícula en bruto.
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)
resultados:
Encontré una solución al hecho de que la configuración de geom_boxplot(outlier.colour = NULL)
ya no funciona en las versiones más nuevas de R (@jonsnow habla sobre la versión 1.0.0 de ggplot2).
Para replicar el comportamiento que propuso @cbeleites, simplemente necesita usar el siguiente código:
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()
como se esperaba, esto produce una trama con puntos que coinciden con el color de la línea.
Por supuesto, uno debe recordar restablecer el valor predeterminado si necesita dibujar varios gráficos:
update_geom_defaults("point", list(colour = "black"))
La solución se encontró leyendo el registro de cambios de ggplot2 en github:
Los valores atípicos de
geom_boxplot()
utilizan el color, el tamaño y la formageom_point()
degeom_point()
. Cambiar los valores predeterminados degeom_point()
conupdate_geom_defaults()
aplicará los mismos cambios a los valores atípicos degeom_boxplot()
. Anteriormente, no era posible cambiar los valores predeterminados para los valores atípicos. (@ThierryO, # 757)
Publicado aquí también: ¿para colorear puntos de diagrama de caja en ggplot2?
Tuve un problema muy similar. Quería hacer coincidir el estilo con una trama anterior, por lo que quería bordes negros con relleno de color y valores atípicos coincidentes.
Mi solución fue sobreimprimir, una vez con color = y el punto de círculo sólido predeterminado, y una vez con relleno = y una forma de punto de círculo abierto
p <- ggplot(mtcars, aes(factor(cyl), mpg))
p + geom_boxplot(aes(colour=factor(cyl))) +
geom_boxplot(aes(fill=factor(cyl)), outlier.shape=21)
Diagrama de caja con relleno coloreado, bordes negros y línea media