如何在 R 中创建分组箱线图?
How to create a grouped boxplot in R?
我想合并分组的三个数据集并获得只有两个框的图形,1 个用于 A,1 个用于 B。你能建议如何获得吗?
我正在尝试在 R 中创建一个分组箱线图。我有 2 个组:A 和 B,在每个组中我有 3 个子组,每个子组有 5 个测量值。
以下是我构建箱线图的方法,但如果有人有更好、更短或更简单的方法,我将不胜感激
A1 <- c(1,2,9,6,4)
A2 <- c(5,1,9,2,3)
A3 <- c(1,2,3,4,5)
B1 <- c(2,4,6,8,10)
B2 <- c(0,3,6,9,12)
B3 <- c(1,1,2,8,7)
DF <- data.frame(A1, A2, A3, B1, B2, B3)
boxplot(DF, col = rainbow(3, s = 0.5))
axis(side = 1, at = c(2,5), labels = c("A","B"))
legend("topleft", fill = rainbow(3, s = 0.5), legend = c(1,2,3), horiz = T)
如何正确分组(连接)A 和 B 中的框,并将轴标题固定为简单的 A 和 B?
我想要这样的东西
当数据采用 long 格式而不是 wide 时,更容易像这样对它们进行分组。从您的向量开始:
DF2 <- data.frame(
x = c(c(A1, A2, A3), c(B1, B2, B3)),
y = rep(c("A", "B"), each = 15),
z = rep(rep(1:3, each=5), 2),
stringsAsFactors = FALSE
)
str(DF2)
# 'data.frame': 30 obs. of 3 variables:
# $ x: num 1 2 9 6 4 5 1 9 2 3 ...
# $ y: chr "A" "A" "A" "A" ...
# $ z: int 1 1 1 1 1 2 2 2 2 2 ...
cols <- rainbow(3, s = 0.5)
boxplot(x ~ z + y, data = DF2,
at = c(1:3, 5:7), col = cols,
names = c("", "A", "", "", "B", ""), xaxs = FALSE)
legend("topleft", fill = cols, legend = c(1,2,3), horiz = T)
使用at
手动控制位置,所以"visual grouping"不是很健壮。 (你可以用width
and/or boxwex
来控制它们之间的间距。)
你也可以选择ggplot2
:
library(ggplot2)
ggplot(DF2, aes(y, x, fill=factor(z))) +
geom_boxplot()
你应该使用ggplot2
ggplot() +
geom_boxplot(data = df, mapping = aes(col_name, value, fill=index)) +
theme( axis.text.x = element_blank()) +
geom_segment(data=hline1, mapping=aes(x=1, y=-0.5, xend=3, yend=-0.5), size=2) +
annotate("text", x = 2, y = -1, label = "A") +
geom_segment(data=hline1, mapping=aes(x=4, y=-0.5, xend=6, yend=-0.5), size=2) +
annotate("text", x = 5, y = -1, label = "B")
使用 base R,我认为 @r2evans 解决方案是最好的。但是,更容易解决问题中的代码的方法是使用选项 xaxt="n"
:
boxplot(DF, col = rainbow(3, s = 0.5), at = c(1:3,5:7), xaxt = "n")
axis(side = 1, at = c(2,6), labels = c("A","B"))
legend("topleft", fill = rainbow(3, s = 0.5), legend = c(1,2,3), horiz = T)
这增加了格式化轴的灵活性。
我想合并分组的三个数据集并获得只有两个框的图形,1 个用于 A,1 个用于 B。你能建议如何获得吗?
我正在尝试在 R 中创建一个分组箱线图。我有 2 个组:A 和 B,在每个组中我有 3 个子组,每个子组有 5 个测量值。
以下是我构建箱线图的方法,但如果有人有更好、更短或更简单的方法,我将不胜感激
A1 <- c(1,2,9,6,4)
A2 <- c(5,1,9,2,3)
A3 <- c(1,2,3,4,5)
B1 <- c(2,4,6,8,10)
B2 <- c(0,3,6,9,12)
B3 <- c(1,1,2,8,7)
DF <- data.frame(A1, A2, A3, B1, B2, B3)
boxplot(DF, col = rainbow(3, s = 0.5))
axis(side = 1, at = c(2,5), labels = c("A","B"))
legend("topleft", fill = rainbow(3, s = 0.5), legend = c(1,2,3), horiz = T)
如何正确分组(连接)A 和 B 中的框,并将轴标题固定为简单的 A 和 B?
我想要这样的东西
当数据采用 long 格式而不是 wide 时,更容易像这样对它们进行分组。从您的向量开始:
DF2 <- data.frame(
x = c(c(A1, A2, A3), c(B1, B2, B3)),
y = rep(c("A", "B"), each = 15),
z = rep(rep(1:3, each=5), 2),
stringsAsFactors = FALSE
)
str(DF2)
# 'data.frame': 30 obs. of 3 variables:
# $ x: num 1 2 9 6 4 5 1 9 2 3 ...
# $ y: chr "A" "A" "A" "A" ...
# $ z: int 1 1 1 1 1 2 2 2 2 2 ...
cols <- rainbow(3, s = 0.5)
boxplot(x ~ z + y, data = DF2,
at = c(1:3, 5:7), col = cols,
names = c("", "A", "", "", "B", ""), xaxs = FALSE)
legend("topleft", fill = cols, legend = c(1,2,3), horiz = T)
使用at
手动控制位置,所以"visual grouping"不是很健壮。 (你可以用width
and/or boxwex
来控制它们之间的间距。)
你也可以选择ggplot2
:
library(ggplot2)
ggplot(DF2, aes(y, x, fill=factor(z))) +
geom_boxplot()
你应该使用ggplot2
ggplot() +
geom_boxplot(data = df, mapping = aes(col_name, value, fill=index)) +
theme( axis.text.x = element_blank()) +
geom_segment(data=hline1, mapping=aes(x=1, y=-0.5, xend=3, yend=-0.5), size=2) +
annotate("text", x = 2, y = -1, label = "A") +
geom_segment(data=hline1, mapping=aes(x=4, y=-0.5, xend=6, yend=-0.5), size=2) +
annotate("text", x = 5, y = -1, label = "B")
使用 base R,我认为 @r2evans 解决方案是最好的。但是,更容易解决问题中的代码的方法是使用选项 xaxt="n"
:
boxplot(DF, col = rainbow(3, s = 0.5), at = c(1:3,5:7), xaxt = "n")
axis(side = 1, at = c(2,6), labels = c("A","B"))
legend("topleft", fill = rainbow(3, s = 0.5), legend = c(1,2,3), horiz = T)
这增加了格式化轴的灵活性。