2015-09-15 18 views
12

Tôi đang tạo một số ô được lập khuôn mặt cho báo cáo. Số lượng các khía cạnh khác nhau giữa 2 và 8. Lý tưởng nhất, tôi muốn kích thước tuyệt đối của mỗi khía cạnh (trên các ô) là giống nhau (ví dụ: 4x4 cm) để dễ so sánh chúng hơn (và trông cũng đẹp hơn)).Đặt kích thước tuyệt đối của các mặt trong ggplot2

Điều đó có khả thi không?

df1 <- structure(list(group1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,1L, 1L, 1L, 1L, 1L), .Label = c("S1", "S2"), class = "factor"), group = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("A", "B", "C", "D", "E"), class = "factor"), value = 1:12), class = "data.frame", row.names = c(NA, -12L), .Names = c("group1", "group", "value")) 

df2 <- structure(list(group1 = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("S1", "S2"), class = "factor"), group = structure(c(4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L), .Label = c("A", "B", "C", "D", "E"), class = "factor"), value = 13:20), class = "data.frame", row.names = c(NA, -8L), .Names = c("group1", "group", "value")) 

library(ggplot2) 

plot1 <- ggplot(df1) + geom_histogram(aes(x=value)) + facet_wrap(~group) 
plot2 <- ggplot(df2) + geom_histogram(aes(x=value)) + facet_wrap(~group) 

enter image description here enter image description here

Trả lời

10

Tôi đã sử dụng các chức năng sau đây cho mục đích này,

set_panel_size <- function(p=NULL, g=ggplotGrob(p), file=NULL, 
          margin = unit(1,"mm"), 
          width=unit(4, "cm"), 
          height=unit(4, "cm")){ 

    panels <- grep("panel", g$layout$name) 
    panel_index_w<- unique(g$layout$l[panels]) 
    panel_index_h<- unique(g$layout$t[panels]) 
    nw <- length(panel_index_w) 
    nh <- length(panel_index_h) 

if(getRversion() < "3.3.0"){ 

    # the following conversion is necessary 
    # because there is no `[<-`.unit method 
    # so promoting to unit.list allows standard list indexing 
    g$widths <- grid:::unit.list(g$widths) 
    g$heights <- grid:::unit.list(g$heights) 

    g$widths[panel_index_w] <- rep(list(width), nw) 
    g$heights[panel_index_h] <- rep(list(height), nh) 

} else { 

    g$widths[panel_index_w] <- rep(width, nw) 
    g$heights[panel_index_h] <- rep(height, nh) 

} 

    if(!is.null(file)) 
    ggsave(file, g, 
      width = convertWidth(sum(g$widths) + margin, 
           unitTo = "in", valueOnly = TRUE), 
      height = convertHeight(sum(g$heights) + margin, 
            unitTo = "in", valueOnly = TRUE)) 

    g 
} 

g1 <- set_panel_size(plot1) 
g2 <- set_panel_size(plot2) 
grid.arrange(g1,g2) 

enter image description here

+1

Cảm ơn, mặc dù tôi vẫn không nhận được làm thế nào để sử dụng chức năng này mà không cần nhận được một thông báo lỗi. Bạn có thể mở rộng câu trả lời của bạn bằng cách hiển thị như thế nào để có được kết quả mong muốn với dữ liệu ví dụ của tôi? – beetroot

+0

Tôi chỉ thử điều này với R Devel, và dòng này không làm việc cho tôi: 'g $ widths [panel_index_w] <- rep (danh sách (chiều rộng), nw)'. Tôi cần phải sử dụng cái này: 'g $ widths [panel_index_w] <- rep (grid ::: unit.list (width), nw)'. –

+0

Để trả lời bình luận trước đó của tôi: dòng 'g $ widths [panel_index_w] <- rep (danh sách (chiều rộng), nw)' nên được thay thế bằng 'g $ widths [panel_index_w] <- rep (width, nw)'. Sau đó mọi thứ hoạt động. –

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