我进行了两项实验,其中一些重复了前一组的条件。我有一个用于唯一批处理 ID 的列,以及另一个包含实验 1 中的 ID 的列,实验 2 中的批处理会复制该 ID。以下是一些像这样存储的示例数据:
test <- data.frame(var1=c(rep("A",4), rep("B",4), rep("C",4), rep("D",4)),
var2=rep(c(rep("A",4), rep("B",4)),2),
value=runif(16,1,5))
这是我的 ggplot 代码:
ggplot(test, aes(x=var1, y=value, fill=var2)) + geom_boxplot()
这为我提供了根据 var1
的因子顺序排列的批处理 ID。
我希望将 var2
中的 A 并排放置,并将 var2
中的 B 并排放置。使用 facet_grid
或 facet_wrap
是唯一的方法吗?
ggplot(test, aes(x=var1, y=value, fill=var2)) + geom_boxplot() +
facet_grid(. ~ var2, scales="free_x")
我尝试添加 group=var2
但这给了我重叠且非常宽的箱线图,我也不明白:
ggplot(test, aes(x=var1, y=value, group=var2, fill=var2)) + geom_boxplot()
Warning message:
position_dodge requires non-overlapping x intervals
我可以使用分面;我问这个问题主要是因为当我无法按照我的预期进行分组时,我感到很惊讶。我还查看了 geom_bar()
的示例以了解更多分组方法,但似乎大多数人都不会以这种方式进行分组。
请随意提供有关如何解决此问题的其他意见。我只是想比较成对的测试结果,以便轻松查看重复试验是否与原始试验相匹配。
最佳答案
使用交互
并调整scale_x_discrete
标签的作弊方法
ggplot(test, aes(x=interaction(var1,var2), y=value, fill=var2)) +
geom_boxplot() +
scale_x_discrete(name = 'var1',breaks = c('A.A','C.A','B.B','D.B'),
labels = c('A','C','B','D'))
编辑感谢@Andrie的评论
或者您可以创建一个适当排序的因子,或(无序)因子,其级别以正确的顺序指定。
- ggplot2 尊重因子水平的顺序(无论是否在
有序
因子中)。 - 默认情况下,R 会按字典顺序对级别进行排序,因此对于任何其他顺序,您需要指定它。
.
library(plyr) # for arrange
var1_order <- unique(as.character(arrange(test,var2)[['var1']]))
test$var1_order <- ordered(test$var1, levels = var1_order)
## or
test$var1_order_2 <- factor(test$var1, levels = var1_order)
## so that
ggplot(test, aes(x=var1_order_2, y=value, fill=var2)) +
geom_boxplot() +
xlab('var1')
## or
ggplot(test, aes(x=var1_order, y=value, fill=var2)) +
geom_boxplot() +
xlab('var1')
两者都会给出相同的结果
编辑——另一种方法
您可以将 x 轴设置为 var2
并按 var1
填充,这将按 var2
排序,然后按 闪避并填充var1
ggplot(test, aes(x=var2,y=value)) +
geom_boxplot(aes(fill = var1))
关于r - 是否需要使用facet_grid/wrap来按除用于填充/颜色之外的变量对箱线图进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11875397/