2011-12-14 29 views
16

Estoy tratando de hacer coincidir el color de los valores parásitos de boxplot con el color de relleno que se establece por estética (scale_colour_discrete).Boxplot, ¿cómo hacer coincidir el color de los atípicos para llenar la estética?

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 el diagrama a continuación. ¿Cómo cambio esos puntos negros para que sean de color rojizo/verdoso en el cuerpo? La opción de color atípico de la gráfica de caja parece elegir un color, y no tan estético, si entiendo correctamente. No me importa usar la estética del color si eso ayuda.

Original Version


Editar:

Adaptado this solution (Changing whisker definition in geom_boxplot). El esquivado horizontal es reseteado por stats_summary y no pude encontrar la manera de recuperarlo. Debo arrojar fácilmente atípicos y estirar los bigotes cuando sea necesario, ya que sé cómo hacerlo ahora.

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

Failed attempt

+1

Esto es imposible con el lanzamiento actual, pero será posible en la próxima versión. – kohske

+0

@kohske, tal vez aún pueda responder su comentario. Si Yosukesabai acepta esta respuesta, es claro para la comunidad SO que esta pregunta está resuelta. (y te sale un representante :)). –

+0

En realidad, encontré la respuesta de kohske ["Cambiar la definición de bigotes en geom_boxplot"] (http://stackoverflow.com/questions/4765482/changing-whisker-definition-in-geom-boxplot), que puede adaptarse para resolver mi problema. Espero que no sea tan desagradable ... – yosukesabai

Respuesta

9

Como @koshke dijo, teniendo los valores extremos de colores como las líneas de la caja (no el color de relleno) se encuentra ahora puede hacerse con facilidad mediante el establecimiento de 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() 

boxplot with coloured outliers

  • outlier.colour deben escribirse con "ou"
  • outlier.colour debe estar fuera aes()

estoy publicando esto como una respuesta tardía porque me encuentro mirando esto una y otra vez, y también he publicado para la pregunta relacionada Coloring boxplot outlier points in ggplot2?.

+0

intenté comprobar tu respuesta funciona antes de aceptar tu respuesta, pero de alguna manera mi instalación R se jodió. ¡Confío en ti y acabo de hacer que la respuesta sea aceptada! – yosukesabai

+0

@yosukesabai: no hay prisa para aceptar respuestas tardías para preguntas antiguas. Espero que tenga su instalación funcionando de nuevo. – cbeleites

+0

Tenga en cuenta que esto no coincide con el color de relleno, como sugeriría el título del OP, pero coincide con el color del esquema/línea, que era lo que necesitaba. +1 – RyanStochastic

4

he encontrado una manera de hacer esto, la edición 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:

demobox.png

5

Encontré una solución al hecho de que la configuración 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).

Con el fin de replicar el comportamiento que @cbeleites propsed sólo hay que utilizar 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 parcela con puntos que coinciden con el color de la línea.

Por supuesto, uno debe recordar para restaurar el valor predeterminado si tiene que dibujar varias parcelas:

update_geom_defaults("point", list(colour = "black")) 

La solución fue encontrada por la lectura de la ggplot2 changelog en github:

Los valores extremos de geom_boxplot() uso el color, el tamaño y la forma predeterminados de geom_point(). El cambio de los valores predeterminados de geom_point() con update_geom_defaults() aplicará los mismos cambios a los valores atípicos de geom_boxplot(). Cambiar los valores predeterminados para los valores atípicos anteriormente no era posible. (@ThierryO, # 757)

Publicado aquí también: Coloring boxplot outlier points in ggplot2?

1

Tuve un problema muy similar. Quería combinar 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 sobre-impresión, una vez con color = y el punto de círculo sólido predeterminada, y una vez con relleno = y un punto en forma 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) 

boxplot with coloured fill, and black borders and median line

+0

también puede hacer 'outlier.colour = NA' en la segunda llamada' geom_boxplot'. – bmayer

+0

Con 'ggplot2' 2.2.1, encontré que la sobreimpresión no era necesaria. 'p + geom_boxplot (aes (fill = factor (cyl)), atípico.forma = 21) 'fue suficiente para obtener un color de relleno en los puntos atípicos que coincidían con el relleno de la caja. –

Cuestiones relacionadas