14

据我所知facet_wrap,按行填充。以同样的方式,您可以指定如何matrix使用byrow我希望您可以对 facet_wrap 执行相同的操作。我知道我可以重新排序一个因素的水平以用这种方式绘制,但如果有一个我忽略的更短的方法,这似乎有点工作。

library(ggplot2)

ggplot(mtcars, aes(x=gear,  y=mpg, fill=vs)) +
    geom_bar(position="dodge", stat="identity") + 
    facet_wrap(~ carb, ncol=2)  #fills by row

我们如何按列填写?

4

2 回答 2

14

该功能在 github 上的 ggplot2 当前开发版本中实现。这个提交实现了一个新的参数dirfacet_wrap所以你只需做

## "v" for vertical or "h" for horizontal (the default)    
ggplot(...) + facet_wrap(~ carb, ncol=2, dir="v")

请注意,此功能目前在 CRAN 版本中不可用。

于 2015-09-08T21:35:50.030 回答
6

可以通过将分面变量转换为因子然后重新调整它来完成。在relevel.byrow我用于matrix(..., byrow=T)级别排序的函数中,然后使用函数将此矩阵转换为向量c(),然后重新调整因子。

#number of columns
nc <- 2
level.byrow <- function(vec, nc){
  fac <- factor(vec) #if it is not a factor
  mlev <- matrix(levels(fac), nrow=nc, byrow=T)
  factor(fac, levels= c(mlev))
}

library(plyr)
ggplot(transform(mtcars, rcarb=level.byrow(carb, nc)), aes(x=gear,  y=mpg, fill=vs)) +
  geom_bar(position="dodge", stat="identity") + 
  facet_wrap(~ rcarb, ncol=nc)

plyr为了方便起见,你可以简单地写

mtcars$rcarb <- level.byrow(mtcars$carb, nc)

当我们没有完整的构面结构时,这也有效,但会给出一些警告。

mtcars2 <- subset(mtcars, carb!=3)
ggplot(transform(mtcars2, rcarb=level.byrow(carb, nc)), aes(x=gear,  y=mpg, fill=vs)) +
  geom_bar(position="dodge", stat="identity") + 
  facet_wrap(~ rcarb, ncol=nc)

carb==3排除的结果:

在此处输入图像描述

于 2012-10-15T09:58:24.137 回答