или же
олчанию для нижнего, среднего и верхнего квантиля в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")