如何在组之间创建空间并控制箱线图中轴标签的大小?

How to create spaces between groups and control size of axis labels in boxplot?

我想在箱线图的 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 箱线图的解决方案感兴趣。

此外,有没有办法减少箱线图之间的差距,例如graphics::boxplot 中的 A.1 和 B.1,就像 ggplot2 中的箱线图 position = position_dodge(.9))? (或者加大B.1和A.2的差距?)

很确定这个问题以前出现过,我可能找不到适合我的问题的翻译。

提前致谢!

要控制 boxplot() 框之间的距离,我们可以使用 at 选项,即 "defaults to 1:n where n is the number of boxes"。相反,我们默认提供一个向量 VEC

为了控制轴标签的大小,我们可以使用 cex.axis,例如cex.axis=.8.

例子

我以?boxplot帮助页面的数据为例,占用的空间不大space。

len要按照dose ~ supp进行分组。所以盒子的数量是根据 tabledimensions 的 product。有了这些信息,我们从长度为 n 的序列中创建向量 VEC(通过一些案例定制),我们从每个第二个元素中减去所需的调整。

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)

这当然可能需要根据具体情况进行一些调整,但您现在已经明白了。