2016-09-27 6 views
3

타일의 패싯 플롯을 결합합니다. 각 타일을 정사각형으로 만들거나 최소한 동일한 높이와 너비를 가져야합니다.grid.arrange에서 layout_matrix를 사용할 때 플롯 영역 너비 고정

지금까지 layout_matrix을 사용하여 타일의 각 행에 동일한 높이를 제공했습니다. 나는 타일의 각 열에 동일한 폭을 고정 시키려고 할 때 붙어있다.

시도하고 내 플롯의 레이아웃 (더 복잡한 실제 데이터 방법) 설명하기 위해 mtcars에 따라 일부 코드 :

이 음모를 생산
library("tidyverse") 
library("gridExtra") 

df0 <- mtcars %>% 
    group_by(cyl) %>% 
    count() 

df1 <- mtcars %>% 
    rownames_to_column("car") %>% 
    mutate(man = gsub("([A-Za-z]+).*", "\\1", car)) 

g <- list() 
for(i in 1:nrow(df0)){ 
    g[[i]] <- ggplot(data = df1 %>% filter(cyl == df0$cyl[i]), 
        mapping = aes(x = "", y = car, fill = qsec)) + 
    geom_tile() + 
    facet_grid(man ~ ., scales = "free_y", space = "free") + 
    labs(x = "", y = "") + 
    guides(fill = FALSE) + 
    theme(strip.text.y = element_text(angle=0)) + 
    coord_fixed() 
} 

m0 <- cbind(c(rep(1, df0$n[1]), rep(NA, max(df0$n) - df0$n[1])), 
      c(rep(2, df0$n[2]), rep(NA, max(df0$n) - df0$n[2])), 
      c(rep(3, df0$n[3]), rep(NA, max(df0$n) - df0$n[3]))) 
grid.arrange(grobs = g, layout_matrix = m0) 

(내 MS 페인트 기술 마이너스) :

enter image description here

아마도 스트립 텍스트와 y 축의 레이블 길이가 다르면 그림 영역의 너비가 달라질 수 있습니다. 이 동작을 어떻게 피할 수 있는지 잘 모르겠습니까? 내가 큰 facet_grid에 만들 수 있다고 생각하지만 위의 플롯의 레이아웃 근처에 아무데도 갈 수 없었다.

답변

2

이것은 다소 까다로운 일입니다. 다행히도 cowplot::plot_grid은 같은 크기의 열을 생성하는 정렬을 이미 수행 할 수 있습니다. 방금 그 기능을 사용하여 보풀을 제거하고 정상적으로 사용하는 격자 패턴에서 높이를 분리했습니다.

plot_grid_gjabel <- function(plots, heights) { 
    grobs <- lapply(plots, function(x) { 
    if (!is.null(x)) 
     cowplot:::ggplot_to_gtable(x) 
    else NULL 
    }) 
    num_plots <- length(plots) 
    num_widths <- unique(lapply(grobs, function(x) { 
    length(x$widths) 
    })) 
    num_widths[num_widths == 0] <- NULL 
    max_widths <- do.call(grid::unit.pmax, 
         lapply(grobs, function(x) { x$widths })) 
    for (i in 1:num_plots) { 
    grobs[[i]]$widths <- max_widths 
    } 
    width <- 1/num_plots 
    height <- heights/max(heights) 
    x <- cumsum(width[rep(1, num_plots)]) - width 
    p <- cowplot::ggdraw() 
    for (i in seq_along(plots)) { 
    p <- p + cowplot::draw_grob(grid::grobTree(grobs[[i]]), x[i], 1 - height[i], 
           width, height[i]) 
    } 
    return(p) 
} 

우리는 단순히과 같이이를 호출 할 수 있습니다 :

plot_grid_gjabel(g, df0$n) 

을 결과 :

enter image description here 우리는 작업 (클로스 WILKE 모든 학점)을 수행하는 작은 정의 함수와 끝까지