или же

олчанию для нижнего, среднего и верхнего квантиля вgeom_boxplot 25% -, 50% - и 75% - квантили. Они вычисляются изy, но можно установить вручную с помощью эстетических аргументовlower, upper, middle (предоставляя такжеx, ymin а такжеymax и настройкаstat="identity").

Однако при этом возникает несколько нежелательных эффектов (см. Версию 1 в примере кода):

Аргументgroup игнорируется, поэтому все значения столбца учитываются в расчетах (например, при вычислении нижнего квантиля для каждой группы)Полученные идентичные боксы сгруппированы поxи повторяется внутри группы так часто, как значение конкретной группы встречается в данных (вместо объединения блоков в более широкое)выбросы не изображены

Предварительно вычисляя нужные значения и сохраняя их в новом фрейме данных, можно обрабатывать первые две точки (см. Версию 2 в примере кода), в то время как третья точка фиксируется путем определения выбросов и добавления их отдельно к график черезgeom_point.

Есть ли более прямой способ изменить квантили без этих нежелательных эффектов?

Пример кода:

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

Версия 1: повторяющиеся графы на значение в A, сгруппированные по 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")

Версия 2. Сначала вычислите аргументы для каждой группы. Решение 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")

Ответы на вопрос(1)

Ваш ответ на вопрос