是否需要facet_grid / wrap来按照用于填充/颜色的变量对箱形图进行分组?

时间:2012-08-09 01:04:36

标签: r ggplot2 boxplot

我进行了两次实验,其中一些复制了前一组的条件。我有一个唯一批次ID的列以及另一个包含实验1的ID的列,实验2的批次复制。以下是一些存储的示例数据:

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。

enter image description here

我希望并排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")

enter image description here

我尝试添加group=var2,但这给了我重叠且非常宽的箱图,我也不明白:

ggplot(test, aes(x=var1, y=value, group=var2, fill=var2)) + geom_boxplot()
Warning message:
position_dodge requires non-overlapping x intervals

enter image description here

我可以使用facetting;我大多都在问这个问题,因为当我无法将我的预期分组时,我感到很惊讶。我还查看了geom_bar()的示例中的更多分组方法,但似乎大多数人并没有这样分组。

随意提供有关如何处理此问题的其他意见。我只是想比较一对测试结果,以便轻松查看复制是否与原始试验相符。

1 个答案:

答案 0 :(得分:4)

使用interaction并调整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')) 

enter image description here

编辑感谢@Andrie的评论

或者您可以使用正确顺序创建适当排序的因子,或(无序)因子。

  • ggplot2尊重因子级别的顺序(无论是否在ordered因子中)。
  • 默认情况下,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))

enter image description here