Как создать пробелы между группами и контролировать размер меток осей в боксплоте? - PullRequest
2 голосов
/ 05 ноября 2019

Я хочу отобразить все значения по оси X на блокпосте от min(x) до max(x). Пример данных:

set.seed(4)
x <- sample(1:30, 100, replace = TRUE)
y <- sample(1:25, 100, replace=TRUE)
z <- sample(LETTERS[1:2], 100, replace = TRUE, prob = c(.5, .5))
boxplot(y ~ z + x, las = 2, col = c(5, 7))
abline(v=seq(2.5,60,2), col = "grey60", lty = "dotted") # For orientation
sort(unique(x))

Здесь 6, 27 и 29 не включены в x. Можно ли по-прежнему иметь их на моей оси X, но, конечно, без коробочного участка? Как B.1 представлен, хотя для него нет доступных значений. Мне было бы интересно найти решение как для обычных коробочных диаграмм, так и для коробочных диаграмм ggplot2.

Кроме того, есть ли способ уменьшить разрыв между коробочными диаграммами, например, для A.1 и B.1, в graphics :: boxplot,как в ggplot2 есть position = position_dodge(.9)) для ящиков? (Или увеличить разрыв между B.1 и A.2?)

Я уверен, что этот вопрос возник раньше, я просто не могу найти правильный перевод для моей проблемы.

Спасибо, вперед!

1 Ответ

2 голосов
/ 05 ноября 2019

Чтобы контролировать расстояние между полями boxplot(), мы можем использовать опцию at, которая "по умолчанию равна 1: n, где n - количество ящиков" . Вместо значения по умолчанию мы предоставляем вектор VEC.

Для контроля размера меток оси мы можем использовать cex.axis, например, cex.axis=.8.

Пример

Я использую данные со страницы справки ?boxplotнапример, который не занимает много места.

len должен быть сгруппирован в соответствии с dose ~ supp. Таким образом, количество ящиков составляет prod число dim включений соответствующих table. С помощью этой информации мы создаем вектор VEC из последовательности длиной n (с некоторой настройкой с учетом регистра), из которой мы вычитаем требуемую корректировку из каждого второго элемента.

n <- prod(dim(with(ToothGrowth, table(dose, supp))))
VEC <- seq(1, n/2, length.out=n)*2 - c(0, .2)
# [1] 2.0 2.6 3.6 4.2 5.2 5.8

Сравнение графиков

op <- par(mfrow=c(2, 1))
# without grouping
boxplot(len ~ dose:supp, data=ToothGrowth,
        boxwex=0.5, col=c("orange", "yellow"),
        main="Guinea Pigs' Tooth Growth",
        xlab="Vitamin C dose mg", ylab="tooth length",
        sep=":", lex.order=TRUE, ylim=c(0, 35), yaxs="i",
        cex.axis=.8)
text(.5, 32, "w/o grouping", col=2, adj=0, font=2)
# with grouping
boxplot(len ~ dose:supp, data=ToothGrowth,
        boxwex=0.5, col=c("orange", "yellow"),
        main="Guinea Pigs' Tooth Growth",
        xlab="Vitamin C dose mg", ylab="tooth length",
        sep=":", lex.order=TRUE, ylim=c(0, 35), yaxs="i",
        cex.axis=.8, at=VEC)
text(1.5, 32, "w/ grouping", col=2, adj=0, font=2)
par(op)

enter image description here

Это, конечно, может потребовать некоторой корректировки с учетом конкретного случая, но у вас есть идея сейчас.

...