Override lower, upper, etc. en boxplot mientras agrupa

Por defecto, para el cuantil inferior, medio y superior engeom_boxplot se considera el 25%, el 50% y el 75% de los cuantiles. Estos se calculan a partir dey, pero se puede configurar manualmente a través de los argumentos estéticoslower, upper, middle (proporcionando tambiénx, ymin yymax y configuraciónstat="identity").

Sin embargo, al hacerlo, se producen varios efectos no deseados (véase la versión 1 en el código de ejemplo):

El argumentogroup se ignora, por lo que todos los valores de una columna se consideran en los cálculos (por ejemplo, al calcular el cuantil más bajo para cada grupo)Las parcelas idénticas resultantes se agrupan porx, y se repite dentro del grupo tan a menudo como el valor específico del grupo aparece en los datos (en lugar de fusionar los cuadros en uno más amplio)outliers no se trazan

Calculando previamente los valores deseados y almacenándolos en un nuevo marco de datos, uno puede manejar los dos primeros puntos (véase la versión 2 en el código de ejemplo), mientras que el tercer punto se fija identificando los valores atípicos y agregándolos por separado a el gráfico a través degeom_point.

Existe una forma más directa de cambiar los cuantiles sin tener estos efectos no deseados?

Código de ejemplo:

set.seed(12)

# Random data in B, grouped by values 1 to 4 in A
u <- data.frame(A = sample.int(4, 100, replace = TRUE), B = rnorm(100))

# Desired arguments
qymax <- 0.9
qymin <- 0.1
qmiddle <- 0.5
qupper <- 0.8
qlower <- 0.2

Versión 1: gráficos de caja repetidos por valor en A, agrupados por A

ggplot(u, aes(x = A, y = B)) + 
  geom_boxplot(aes(group=A, 
                   lower = quantile(B, qlower), 
                   upper = quantile(B, qupper), 
                   middle = quantile(B, qmiddle), 
                   ymin = quantile(B, qymin), 
                   ymax = quantile(B, qymax) ), 
               stat="identity")

Versión 2: Calcule primero los argumentos para cada grupo. Solución base R

Bgrouped <- lapply(unique(u$A), function(a) u$B[u$A == a])
.lower <- sapply(Bgrouped, function(x) quantile(x, qlower))
.upper <- sapply(Bgrouped, function(x) quantile(x, qupper))
.middle <- sapply(Bgrouped, function(x) quantile(x, qmiddle))
.ymin <- sapply(Bgrouped, function(x) quantile(x, qymin))
.ymax <- sapply(Bgrouped, function(x) quantile(x, qymax))

u <- data.frame(A = unique(u$A), 
                lower = .lower, 
                upper = .upper, 
                middle = .middle, 
                ymin = .ymin, 
                ymax = .ymax)    

ggplot(u, aes(x = A)) + 
  geom_boxplot(aes(lower = lower, upper = upper, 
                   middle = middle, ymin = ymin, ymax = ymax ), 
               stat="identity")

Respuestas a la pregunta(1)

Su respuesta a la pregunta