如何在组之间创建空间并控制箱线图中轴标签的大小?
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
进行分组。所以盒子的数量是根据 table
的 dim
ensions 的 prod
uct。有了这些信息,我们从长度为 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)
这当然可能需要根据具体情况进行一些调整,但您现在已经明白了。
我想在箱线图的 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
进行分组。所以盒子的数量是根据 table
的 dim
ensions 的 prod
uct。有了这些信息,我们从长度为 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)
这当然可能需要根据具体情况进行一些调整,但您现在已经明白了。