2012-10-15 35 views
11

Theo như tôi có thể nói facet_wrap lấp đầy theo hàng. Cũng giống như cách bạn có thể chỉ định cách điền một số matrix với byrow Tôi đã hy vọng bạn có thể làm tương tự với facet_wrap. Tôi biết tôi có thể sắp xếp lại các cấp độ của một yếu tố để âm mưu trong maner này nhưng điều này có vẻ như một chút công việc nếu có một phương pháp ngắn hơn mà tôi nhìn.facet_wrap điền vào theo cột

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 

Làm cách nào để điền vào cột?

+0

Câu hỏi hay. Gửi nó như là một yêu cầu tính năng cho Winston trên 'ggplot2' [repo] (https://github.com/hadley/ggplot2/issues?labels=feature&page=1&state=open). :) – Maiasaura

+0

Xong: https://github.com/hadley/ggplot2/issues/695 –

+0

Mặc dù có thể tôi đã thêm yêu cầu vào vị trí sai vì liên kết không khớp với yêu cầu của bạn. –

Trả lời

4

Nó có thể được thực hiện bằng cách chuyển đổi biến faceting thành yếu tố và sau đó san lấp mặt bằng nó. Trong hàm relevel.byrow Tôi đã sử dụng matrix(..., byrow=T) cho thứ tự mức độ, sau đó chuyển đổi ma trận này thành một véc tơ sử dụng chức năng c() và sau đó là hệ số lại.

#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) 

tôi đã sử dụng plyr cho thuận tiện, bạn có thể chỉ đơn giản là viết

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

này cũng hoạt động khi chúng ta không có cấu trúc khía cạnh đầy đủ, nhưng cho vài cảnh báo.

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) 

quả với carb==3 loại trừ:

enter image description here

+0

Có vẻ như tùy chọn theo cột không có sẵn cho facet_wrap. Giải pháp này bị sắp xếp lại các mức và do đó một biến mới sẽ được tạo ra để giữ nguyên bản gốc. Không lý tưởng nhưng tôi nghĩ công việc tốt nhất hiện nay. Cảm ơn bạn đã suy nghĩ của bạn. –

4

Tính năng này được thực hiện trong các phiên bản phát triển hiện tại của ggplot2 trên github. This commit thực hiện một tham số mới dir của facet_wrap, vì vậy bạn sẽ chỉ cần làm

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

Lưu ý rằng tính năng này hiện không có sẵn trong các phiên bản trên cran.

+0

Đây là giải pháp lý tưởng hiện tại vì dễ thực hiện. Tham số 'dir' tới' facet_wrap() 'bây giờ là một phần của bản phát hành gGplot2 CRAN. – Megatron

Các vấn đề liên quan