2016-09-27 3 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

関連する問題